多维数组linq查询

时间:2017-05-18 09:48:44

标签: vb.net linq sorting

我有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实现第一个结果?

2 个答案:

答案 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