我有List<Person>
,而是希望将它们转换为简单处理为List<string>
,执行以下操作:
List<Person> persons = GetPersonsBySeatOrder();
List<string> seatNames = persons.Select(x => x.Name).ToList();
Console.WriteLine("First in line: {0}", seatNames[0]);
LINQ to Objects对象保证上的.Select()
语句是否不会更改列表成员的顺序?假设没有添加明确的不同/分组/排序
另外,如果首先使用任意.Where()
子句,是否仍然保证保持相对顺序,或者有时使用非迭代过滤?
正如Fermin在上面评论的那样,这实际上是一个重复的问题。我没有选择正确的关键字来搜索stackoverflow
答案 0 :(得分:2)
在当前的.Net实现中,它使用了这样的代码。但是无法保证将来会实施此项目。
private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector)
{
int index = -1;
foreach (TSource source1 in source)
{
checked { ++index; }
yield return selector(source1, index);
}
}
答案 1 :(得分:2)
它取决于底层集合类型而不是任何东西。您可以从HashSet获得不一致的排序,但List是安全的。即使您想要的顺序是隐式提供的,但如果您需要它,最好定义一个显式排序。看起来你正在根据方法名称进行判断。
答案 2 :(得分:0)
是的,保证Linq Select
会按照传递的枚举顺序返回其所有结果。像大多数Linq函数一样,它被完全指定了它的作用。除非处理错误,否则<{>} 可能是Select
的代码:
IEnumerable<Y> Select<X, Y>(this IEnumerable<X> input, Func<X, Y> transform)
{
foreach (var x in input)
yield return transform(x);
}
但是,正如萨曼莎·布兰纳姆(Samantha Branham)指出的那样,底层集合可能没有内在的顺序。我见过哈希表会在读取时重新排列。