2012-05-02 62 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( )'然後需要......儘管我仍然認爲你應該採取優化措施然而, –