foreach循环中的foreach:
var list1 = new List<int>() {0,1,2,3,4,5,6,7,8,9};
var list2 = new List<int>() {9,8,7,6,5,4,3,2,1,0};
foreach (var list1Value in list1)
{
foreach (var list2Value in list2)
{
if (list1Value == list2Value)
// do something
}
}
或者foreach循环中的IEnumerable
var list1 = new List<int>() {0,1,2,3,4,5,6,7,8,9};
var list2 = new List<int>() {9,8,7,6,5,4,3,2,1,0}
var enumerator = (System.Collections.IEnumerator)list2.GetEnumerator();
foreach (var list1Value in list1)
{
enumerator.Reset();
while (enumerator.MoveNext())
{
if (list1Value == (int)enumerator.Current)
// Do something
}
}
我更喜欢第一个用于阅读,但认为第二个更有效。请注意,代码只是一个示例,它并不表示我实际运行的代码。
答案 0 :(得分:3)
每个列表有10个项目,没有人关心通过调用Reset
保存的10个枚举器分配。这绝对是微优化,即使第二种方法确实为您节省了一些分配。我肯定会考虑第一种方法的可读性,甚至添加一些LINQ,如下所示:
foreach (var list1Value in list1) {
var tmp = list1Value;
foreach (var list2Value in list2.Where(item => item == tmp)) {
// Do something
}
}
答案 1 :(得分:3)
这样做你想要的吗?
var list1 = new List<int>() {0,1,2,3,4,5,6,7,8,9};
var list2 = new List<int>() {9,8,7,6,5,4,3,2,1,0};
foreach (var item in list1.Intersect(list2))
{
// Do something
}
答案 2 :(得分:2)
如果您选择使用foreach
或while
循环并不重要,因为foreach
循环实际上已被分解为while
循环编译成IL。
看一下这个foreach
循环:
IEnumerable<int> enumerable = Enumerable.Range(1, 100);
foreach (int e in enumerable)
{
}
编译成IL后,它看起来像这样:
var enumerable = Enumerable.Range(1, 100);
IEnumerator<int> enumerator = enumerable.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int element = enumerator.Current;
//here goes your action instructions
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
我总是更喜欢更可读的代码,它绝对是foreach
循环。
有关详细信息,请阅读这篇精彩的文章:http://www.abhisheksur.com/2011/01/internals-of-loops-while-for-and.html