gpt4 book ai didi

c# - 它被订购了多少次 IENumerable?

转载 作者:太空狗 更新时间:2023-10-30 00:37:46 25 4
gpt4 key购买 nike

我知道当我迭代 IEnumerable 时,我会迭代源集合,因此如果我在 IEnumerable 的下一次迭代中修改了源集合,它会将修改计算在内。

所以我想知道当我有一个有序的 IEnumerable 时它会如何影响它。

例如,如果我有这个:

List<MyType> myNoOrderedList //add my items

IEnumerable<MyType> myOrderedIEnumerable = myNoOrderedList
.OrderBy(x => x.Property);

foreach(MyType in myOrderedIEnumerable)
{
//Do something
}

假设我在列表中有 3 个元素,在 IEnumerable 上的每次迭代中,列表是有序的还是只对列表进行一次排序?

如果在“做某事”中添加或删除项目会怎样? IEnumerable 有初始订购的项目或必须重新订购以考虑列表的修改?

最佳答案

答案:

  1. 最多一次(在实体化如果有的话)
  2. 由于您已经具体化myOrderedIEnumerable,因此不会看到对初始myNoOrderedList 的任何修改:

简化示例:

 List<string> initial = new List<String>() {
"a", "z", "e", "d";
};

// Nothing will be done at this point (no ordering)
var ordered = initial.
.OrderBy(x => x.Property);

// ordered has not materialized here, so it'll feel Addition
initial.Add("y"); // <- will be added into ordered

// Here on the first loop ordered will be materialized and since
// initial and ordered are different collection now, we can modify
// initial without changing ordered
foreach (var item in ordered) {
if (item == "a") {
initial.Add("b");
initial.Remove("z");
}

Console.WriteLine(item);
}

结果:

a
d
e
y <- before materialization
z

编辑:请注意,物质化是一件棘手的事情:它可能被称为:

  1. 立即,在声明中,例如在 .ToList().Any().FirstOrDefault()
  2. 之后
  3. 在第一项上,例如.OrderBy(你的情况)
  4. 从不.Where(), .SkipWhile() - 查看 Magnus 的评论

Linq 是惰性的,会尽可能晚地执行具体化。

关于c# - 它被订购了多少次 IENumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45141732/

25 4 0