1

エンティティを職位でソートするために、次のものがあります。目的の順序は、別の配列で定義されます。C# では、次のコードが機能します。

IEnumerable<CreditObject> query = credits.OrderBy(x =>
{
    for (int i = 0; i < list.Length; i++)
    {
        if (x.Job == list[i])
            return i;
    }
    throw new NotImplementedException("Job not within List");
});

ただし、これを VB.net に変換する必要があります。同等のものは次のようになります。

Dim query As IEnumerable(Of CreditObject) = credits.OrderBy(Function(x) 

    For j As Integer = 0 To templ.Length - 1
        If x.Job = templ(j) Then
            Return j
        End If
    Next

End Function)

これはコンパイルされません..の直後に「式が必要です」と表示されFunction(x)ます. 私は何を間違っていますか?

4

1 に答える 1

4

まず、それを真面目な方法にします。

public int GetCreditObjectPosition(CreditObject x, List<int> list) {
    for (int i = 0; i < list.Length; i++) {
        if (x.Job == list[i]) {
            return i;
        }
    }
    throw new NotImplementedException("Job not within List");
}

次に、あなたはただ言う:

IEnumerable<CreditObject> query =
    credits.OrderBy(x => GetCreditObjectPosition(x, list));

これは、VBに変換するのに十分簡単です。

GetCreditObjectPosition次に、パフォーマンスを大幅に改善するために書き直します。

public int GetCreditObjectPosition(CreditObject x, List<int> list) {
    var jobDictionary = 
        list.Select((job, index) => new { Job = job, Index = Index } )
            .ToDictionary(item => item.Job, item => item.Index);
    int position;
    if(!jobDictionary.TryGetValue(x.Job, out position)) {
        throw new Exception("Job not within List");
    }
    return position;
}
于 2012-04-24T09:55:57.083 に答える