我正在尝试交换特定项目的顺序IEnumerable
。
给定一个IEnumerable<int> a;
元素:
1、2、3、4、5
我想做的是编写一个交换迭代器,结果a.Exchange(1, 2)
是:
1、3、2、4、5
但是我不想为了这个简单的目的多次迭代可枚举。到目前为止,我所拥有的是:
public static IEnumerable<T> Exchange<T>(
this IEnumerable<T> source, int index1, int index2) {
var i=0;
foreach(var y in source) {
if(index1==i) {
var j=0;
foreach(var x in source) {
if(index2==j) {
yield return x;
break;
}
++j;
}
}
else {
if(index2==i) {
var j=0;
foreach(var x in source) {
if(index1==j) {
yield return x;
break;
}
++j;
}
}
else {
yield return y;
}
}
++i;
}
}
这是一个假设,index1
并且index2
不会超过可枚举的元素。在大多数情况下,代码完成了交换(排序)的工作,但它确实迭代了不止一次。注意index1
andindex2
可能不是 的真正索引source
,当枚举发生时它们将是Mth
andNth
元素。
ToArray
或者ToList
也可能增加迭代次数。