我有5维数组,当使用linq查询时,结果按维度方式排序:
阵列(a)(b)(c)(d)(e),尺寸= 1
使用下一个:
For e = 0 To dimension - 1
For d = 0 To dimension - 1
For c = 0 To dimension - 1
For b = 0 To dimension - 1
For a = 0 To dimension - 1
listbox.Items.Add(array(a, b, c, d, e).disc)
Next
Next
Next
Next
Next
这将导致:
ABCDE
00000
10000
01000
...
如果我使用linq:
listbox.Items.AddRange((From item In array Select item.disc).ToArray)
这将导致:
ABCDE
00000
00001
00010
...
如何用linq实现第一个结果?
答案 0 :(得分:0)
您需要一个自定义迭代器按照您想要的排名顺序浏览数组,这与内置顺序相反。
public static class ArrayExt {
public static IEnumerable<T> GetFirstFastestEnumerator<T>(this Array src) {
var srcRank = src.Rank;
var indices = new int[srcRank];
var len = src.Length;
for (var j1 = 0; j1 < srcRank; ++j1)
indices[j1] = src.GetLowerBound(j1);
int curRank = 0;
for (var j1 = 0; j1 < len; ++j1) {
yield return (T)src.GetValue(indices);
while (curRank < srcRank) {
if (indices[curRank] < src.GetUpperBound(curRank)) {
++indices[curRank];
curRank = 0;
break;
}
else {
indices[curRank] = src.GetLowerBound(curRank);
++curRank;
}
}
}
}
}
您可以使用LINQ或foreach
。将arrayType
替换为array
中存储的类。
listbox.Items.AddRange((From item In array.GetFirstFastestEnumerator<arrayType>() Select item.disc).ToArray)
或Visual Basic版本:
Public Module Ext
<Extension()> _
Public Iterator Function GetFirstFastestIterator(Of T)(source As Array) As IEnumerable(Of T)
Dim srcRank = source.Rank
Dim indices = New Integer((srcRank) - 1) {}
Dim len = source.Length
For i = 0 To srcRank - 1
indices(i) = source.GetLowerBound(i)
Next
Dim curRank As Integer = 0
For i = 0 To len - 1
Yield CType(source.GetValue(indices), T)
While (curRank < srcRank)
If (indices(curRank) < source.GetUpperBound(curRank)) Then
indices(curRank) = indices(curRank) + 1
curRank = 0
Exit While
Else
indices(curRank) = source.GetLowerBound(curRank)
curRank = curRank + 1
End If
End While
Next
End Function
End Module
答案 1 :(得分:0)
Public Class ArrayExt
Public Shared Function GetFirstFastestEnumerator(Of T)(source As Array) As IEnumerable(Of T)
Dim srcRank = source.Rank
Dim indices = New Integer((srcRank) - 1) {}
Dim len = source.Length
For i = 0 To srcRank - 1
indices(i) = source.GetLowerBound(i)
Next
Dim curRank As Integer = 0
For i = 0 To len - 1
Return CType(source.GetValue(indices), T)
While (curRank < srcRank)
If (indices(curRank) < source.GetUpperBound(curRank)) Then
indices(curRank) = indices(curRank) + 1
curRank = 0
Exit While
Else
indices(curRank) = source.GetLowerBound(curRank)
curRank = curRank + 1
End If
End While
Next
End Function
End Class