LINQ to Objects是否保持其顺序

时间:2013-01-09 16:09:31

标签: c# linq-to-objects

我有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

Preserving order with LINQ

3 个答案:

答案 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)指出的那样,底层集合可能没有内在的顺序。我见过哈希表会在读取时重新排列。