So I have a Query that searches for various items. But I just want their Id so I used a projection to return me only the Ids and not the other elements of the item. but converting from ObjectId .ToString() and then .ToList() returns me a List<char> instead List<string>
var items = await this.ItemAppService.GetAllAsync(expression,
x => new
{
Ids = x.Id.ToString().ToList(),
});
var Ids = items.SelectMany(x => x.Ids.Select(x => x)).ToList();
I would like to understand why i'm returning a List<Char> and how I convert it to List<String>
CodePudding user response:
.ToString().ToList()returns a NewList<char>
Yes, because a string is an IEnumerable<char> (a bunch of characters that can be enumerated over). ToList is an extension method on all IEnumerable<T>, that returns a List<T>.
So the Ids property in the anonymous object is already a List<char>:
x => new
{
// this "Ids" is already a List<char>
Ids = x.Id.ToString().ToList(),
});
You then do some more shuffling on it, but not meaningfully changing anything. x.Ids.Select(x => x) returns an Innumerable<char> with the same contents as x.Ids. And SelectMany adds up all those IEnumerable<char> in each of the anonymous objects into one big IEnumerable<char>, which you then convert to a list.
I'm not sure why you have used an anonymous object here. If you just want a List<string> with all the IDs, just do:
var ids = await this.ItemAppService.GetAllAsync(
expression,
// assuming x.Id is not already a string
x => x.Id.ToString()
).ToList();
CodePudding user response:
The first ToList is unnecessary, you want strings, and with that ToList() invocation you are converting your strings to char arrays. So the code should be rewritten as:
var items = await this.ItemAppService.GetAllAsync(expression,
x => new
{
Id = x.Id.ToString(),
});
var ids = items.Select(x => x.Id).ToList();
