繁体   English   中英

将C#转换为VB.NET时出错

[英]Error Converting C# to VB.NET

我正在尝试将此方法转换为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的定义...有人可以帮助我吗?

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()进行显式调用。 该代码示例已更新,以反映这一点。

原始的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

就像从referenceGroup中删除括号一样简单吗? 我想知道vb是否认为这是一种方法而不是标识符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM