C# LINQ对象是否保持其顺序

C# LINQ对象是否保持其顺序,c#,linq-to-objects,C#,Linq To Objects,我有一个列表,而是想将它们转换为列表,进行以下操作: List<Person> persons = GetPersonsBySeatOrder(); List<string> seatNames = persons.Select(x => x.Name).ToList(); Console.WriteLine("First in line: {0}", seatNames[0]); List persons=GetPersonsBySeatOrder(); 列出

我有一个
列表
,而是想将它们转换为
列表
,进行以下操作:

List<Person> persons = GetPersonsBySeatOrder();
List<string> seatNames = persons.Select(x => x.Name).ToList();

Console.WriteLine("First in line: {0}", seatNames[0]);
List persons=GetPersonsBySeatOrder();
列出seatNames=persons.Select(x=>x.Name.ToList();
WriteLine(“第一行:{0}”,seatNames[0]);
LINQ to Objects对象上的
.Select()
语句是否保证不会更改列表成员的顺序?假设未添加明确的不同/分组/排序

另外,如果先使用任意的
.Where()
子句,是否仍保证保持相对顺序,或者有时使用非迭代过滤


正如Fermin在上面所评论的,这本质上是一个重复的问题。我未能选择正确的关键字来搜索stackoverflow


在当前的.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);
  }
}
私有静态IEnumerable SelectIterator(IEnumerable源代码,Func选择器)
{
int指数=-1;
foreach(源中的TSource source1)
{
选中{++index;}
收益率返回选择器(source1,索引);
}
}

它主要取决于基础集合类型。可以从哈希集中获得不一致的排序,但列表是安全的。即使您想要的排序是隐式提供的,但如果需要,最好定义一个显式排序。从方法名称来看,您似乎正在这样做。

是的,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);
}
IEnumerable选择(此IEnumerable输入,Func转换)
{
foreach(输入中的变量x)
收益-收益转换(x);
}

但正如Samantha Branham指出的,底层集合可能没有内在的顺序。我见过在读取时重新排列自己的哈希表。

这里有关于linq查询和排序的详细信息:我怀疑像.Select()这样广泛使用的方法的内部实现是否会被更改为以不同的顺序返回对象。数据库行的顺序没有保证。列表可以。它应该完全依赖于基础集合类型(即,基础集合类型的枚举数),并且应该保留列表顺序。Select将使用列表类型的枚举数,并且当前它保留顺序,这是有保证的。@Fermin实际上在.NET和.NET Core之间的
Join
中有一个更改,但是一旦发现它就被更正了。