是否LINQ到对象保持其顺序

问题描述 投票:16回答:3

我有一个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到对象的.Select() Statement对象保证不改变列表成员的顺序?假设没有明确的不同/分组/排序添加

此外,如果一个任意.Where()子句第一次使用时,它仍能保证保持相对顺序,或者它有时使用非迭代过滤?


正如上面费尔明评论,这基本上是一个重复的问题。我没上选择正确的关键词进行搜索计算器

Preserving order with LINQ

c# linq-to-objects
3个回答
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);
  }
}

2
投票

它依赖于底层集合类型比什么都重要。你可以从一个HashSet得到不一致的排序,而是一个列表是安全的。即使你想执行的顺序是隐式地提供,这是更好,如果你需要它虽然定义明确排序。它看起来像你这样做的方法名称即判断。


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);
}

但随着萨曼莎布拉纳姆指出,底层集合可能不具有内在的秩序。我已经看到了重新安排自己在读哈希表。

© www.soinside.com 2019 - 2024. All rights reserved.