[英]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.