这是出于好奇我想问这个问题...
这是我的代码:
for (int i = 0; i < myList.Count - 1; ++i)
{
for (int j = i+1; j < myList.Count; ++j)
{
DoMyStuff(myList[i], myList[j]);
}
}
Run Code Online (Sandbox Code Playgroud)
非常简单的循环,但显然它只适用于 List ......但我想知道......我如何编写这个循环以使其独立于集合的类型(源自 IEnumerable ......)我的第一个想法:
IEnumerator it1 = myList.GetEnumerator();
while (it1.MoveNext())
{
IEnumerator it2 = it1; // this part is obviously wrong
while (it2.MoveNext())
{
DoMyStuff(it1.Current, it2.Current);
}
}
Run Code Online (Sandbox Code Playgroud)
有一些扩展方法Count()和ElementAt(int)是在 上声明的IEnumerable<T>。它们在System.Linq命名空间中声明,如果您使用 C# 3 之后的任何 C# 版本,则默认情况下该命名空间应包含在您的 .cs 文件中。这意味着您可以执行以下操作:
for (int i = 0; i < myList.Count() - 1; ++i)
{
for (int j = i+1; j < myList.Count(); ++j)
{
DoMyStuff(myList.ElementAt(i), myList.ElementAt(j));
}
}
Run Code Online (Sandbox Code Playgroud)
但是,请注意,这些是方法,将在迭代过程中一遍又一遍地调用,因此您可能希望将它们的结果保存到变量中,例如:
var elementCount = myList.Count();
for (int i = 0; i < elementCount - 1; ++i)
{
var iElement = myList.ElementAt(i);
for (int j = i+1; j < elementCount; ++j)
{
DoMyStuff(iElement, myList.ElementAt(j));
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以尝试一些 LINQ,它会选择所有符合条件的元素对,然后使用 simpleforeach来调用处理,例如:
var result = myList.SelectMany((avalue, aindex) =>
myList.Where((bvalue, bindex) => aindex < bindex)
.Select(bvalue => new {First = avalue, Second = bvalue}));
foreach (var item in result)
{
DoMyStuff(item.First, item.Second);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3056 次 |
| 最近记录: |