C# 在foreach语句中调用ToList()

C# 在foreach语句中调用ToList(),c#,performance,linq,C#,Performance,Linq,我最近开始了一项新工作,并负责一个已经存在的项目,以优化代码并提高效率(例如,消除冗余代码,将长进程从UI线程中移出,等等) 我最近遇到了一个方法,它使用嵌套的foreach语句将列表与自身进行比较,以检查重复数据。但是,它直接在foreach语句中使用ToList()方法。例如: foreach(ObjectRow Outer_Row in t.ToList()) { bool bComparing = false; foreach(ObjectRow Inner_Row in t

我最近开始了一项新工作,并负责一个已经存在的项目,以优化代码并提高效率(例如,消除冗余代码,将长进程从UI线程中移出,等等)

我最近遇到了一个方法,它使用嵌套的
foreach
语句将列表与自身进行比较,以检查重复数据。但是,它直接在
foreach
语句中使用
ToList()
方法。例如:

foreach(ObjectRow Outer_Row in t.ToList()) {
   bool bComparing = false;
   foreach(ObjectRow Inner_Row in t.ToList()) {
      //code for comparing
   }
}
我知道这段代码至少生成了两次列表;一次用于外环,一次用于内环。我的问题是,
t.ToList()
方法是否在循环的每次迭代中实际运行?也就是说,如果
t
中有100个项,那么
ToList()
是否总共被调用了200次(外部循环调用了100次,内部循环调用了100次),或者仍然只调用了两次(外部循环调用了一次,内部循环调用了一次)

我认为这样做会更有效率:

var list = t.ToList();
foreach(ObjectRow Outer_Row in list) {
   bool bComparing = false;
   foreach(ObjectRow Inner_Row in list) {
   //code for comparing
   }
}
应该注意的是,
t
是从LINQ表达式生成的,这导致
t
是一个
IEnumerable
。那么,这样做会更好吗:

foreach(ObjectRow Outer_Row in t) {
   bool bComparing = false;
   foreach(ObjectRow Inner_Row in t) {
      //code for comparing
   }
}
相对于原始的
IEnumerable
,在列表上枚举有什么好处吗


提前感谢您提供的任何信息和/或建议。

总共被叫了200次
101次。对于外部循环,100对于内部循环,您的想法通常会更快,尽管如果没有看到比较的
//代码,就很难确定。如果您想要找到重复的,您可以将两个
IEnumerable
s(分开)排序,然后像合并一样移动(合并排序)。a
ToList()
可能用于创建副本,因此可以在列表中修改集合。@JeroenvanLangen这些列表在代码中根本没有修改,只是循环而已。