2012-05-02 63 views
0

我试图将此方法转换为VB.NET,但在线转换器似乎使转换它乱七八糟。有人可以帮助:错误将C#转换为VB.NET

C#原:

private IEnumerable<IGrouping<string, Reference>> FindReferencesWithTheSameShortNameButDiffererntFullNames(List<Reference> references) 
     { 
      return from reference in references 
        group reference by reference.ReferencedAssembly.Name 
         into referenceGroup 
         where referenceGroup.ToList().Select(reference => reference.ReferencedAssembly.FullName).Distinct().Count() > 1 
         select referenceGroup; 
     } 

VB.NET使用在线转换器:

Private Function FindReferencesWithTheSameShortNameButDiffererntFullNames(references As List(Of Reference)) As IEnumerable(Of IGrouping(Of String, Reference)) 
     Return _ 
      Where referenceGroup.ToList().[Select](Function(reference) reference.ReferencedAssembly.FullName).Distinct().Count() > 1 
End Function 

Where这个错误没有被声明。

我不会想到的是,VB不会是DIS类似于C#是这样的:

Private Function FindReferencesWithTheSameShortNameButDiffererntFullNames(references As List(Of Reference)) As IEnumerable(Of IGrouping(Of String, Reference)) 
      Return From reference In references 
        Group reference By reference.ReferencedAssembly.Name 
        Into referenceGroup() 
        Where referenceGroup.ToList().Select(Function(reference) ReferencedAssembly.FullName).distinct().count() > 1 
                 Select referenceGroup 

     End Function 

,但我得到:方法referenceGroup的定义是不是在这种情况下访问...有人可以帮我吗?

+1

你有没有试图通过自己查找语法一组,成,其中,select语句。这将涉及用手工转换代码,你应该这样做,似乎你没有尝试过,自动工具给了你什么。 –

+0

@Ramhound - 是的,我自己尝试过这个 - 我最初发布了转换后的代码,以便我没有得到轻松的评论,说'使用在线代码转换器! –

回答

2

VB.Net语法略有不同。 Group关键字还指示当前分组,可以直接使用或分配给指定的变量。

Private Function FindReferencesWithTheSameShortNameButDiffererntFullNames(references As List(Of Reference)) As IEnumerable(Of IGrouping(Of String, Reference)) 
    Return From referenceGroup In references.GroupBy(Of String, Reference)(Function(reference) reference.ReferencedAssembly.Name, Function(reference) reference) 
      Where (referenceGroup.ToList().Select(Function(reference) As String 
                Return reference.ReferencedAssembly.FullName 
               End Function).Distinct().Count() > 1) 
      Select referenceGroup 
End Function 

更新

我只注意到你返回一个IGrouping。查询理解语法在这种情况下将不起作用,您将不得不明确致电GroupBy()。该代码示例已更新以反映该情况。

0

就像从参考组中删除括号一样简单吗?我想知道如果VB认为这是一种方法不是一个标识符。

+0

不幸的是 - IDE将它们添加回来,如果你从我的示例中删除它们 –

2

最初的C#代码会不必要地执行一些操作,所以先让它清理并做一些优化。

ToList()调用是不必要的,删除它。调用Count()枚举所有项目以获得计数,但您只想检查是否有多个项目。最好跳过第一个结果,看看是否还有更多,并且在逻辑上是相同的。

private IEnumerable<IGrouping<string, Reference>> 
    FindReferencesWithTheSameShortNameButDiffererntFullNames(
     List<Reference> references) 
{ 
    return 
     from reference in references 
     group reference by reference.ReferencedAssembly.Name into referenceGroup 
     where referenceGroup 
      .Select(reference => reference.ReferencedAssembly.FullName) 
      .Distinct() 
      .Skip(1) 
      .Any() 
     select referenceGroup; 
} 

所以翻译这个:

Private Function FindReferencesWithTheSameShortNameButDiffererntFullNames(references As List(Of Reference)) As IEnumerable(Of IGrouping(Of String, Reference)) 
    Return 
     From referenceGroup In references.GroupBy(Function(reference) reference.ReferencedAssembly.Name) 
     Where referenceGroup.Select(Function(reference) reference.ReferencedAssembly.FullName).Distinct.Skip(1).Any 
     Select referenceGroup 
End Function 
+0

谢谢杰夫,但不幸的是,这不会编译(它在where引用组错误 - 我认为它与@ChrisHannon提到关于组语法 –

+0

嗯,我很确定这个构造是有效的,当我有机会回到家时,我将不得不再次看到它 –

+0

哇,我没有意识到VB会这样做,所以明确的GroupBy( )'然后需要......尽管我仍然认为你应该采取优化措施然而, –