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