18

我有 aList<Person>而是想将它们转换为 a 进行简单处理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()子句,是否仍能保证保持相对顺序,还是有时会使用非迭代过滤?


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

使用 LINQ 保持顺序

4

3 回答 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);
  }
}
于 2013-01-09T16:20:52.067 回答
2

它最依赖于底层集合类型。您可能会从 HashSet 得到不一致的排序,但 List 是安全的。即使您想要的排序是隐式提供的,但如果您需要,最好定义一个显式排序。从方法名称来看,您似乎正在这样做。

于 2013-01-09T16:27:15.180 回答
0

是的,LinqSelect保证按照传递的枚举顺序返回所有结果。像大多数 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 指出的那样,底层集合可能没有内在的顺序。我见过在读取时重新排列自己的哈希表。

于 2019-02-08T04:38:28.247 回答