2012-04-24 40 views
1

我有以下工作位置对实体进行排序。所需的顺序在另一个阵列中定义。在C#中这段代码的工作原理如下:在OrderBy中转换Lambda表达式从C#到VB.net谓词

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)后我“表达期望”的权利。我究竟做错了什么?

+2

VB.NET哪个版本您使用的? VB 9不支持带多条语句的lambda表达式 – 2012-04-24 09:46:38

+0

好吧,我认为VB 2008是版本9,所以这可能是问题。谢谢!什么是替代方案?某种形式的代表来克服这一点? – rdoubleui 2012-04-24 09:54:27

回答

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; 
} 
+0

谢谢,它的工作原理。 – rdoubleui 2012-04-24 11:05:08