0

このメソッドを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が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の定義にアクセスできません...誰かが私を助けてくれますか?

4

3 に答える 3

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()。コード例はそれを反映するように更新されました。

于 2012-05-02T16:57:14.803 に答える
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
于 2012-05-02T17:29:58.563 に答える
0

referenceGroupから角かっこを削除するのと同じくらい簡単ですか?vbがそれを識別子ではなくメソッドだと思っているのだろうか。

于 2012-05-02T17:00:04.543 に答える