VB LINQ语句转C#遇编译错误,求解决方案及语法解释
问题解析与修正
一、VB中Into g = Group的作用
在VB的LINQ分组语法里,Group w By w.PublicSubType, w.LawArea Into g = Group做了两件事:
- 按
PublicSubType和LawArea两个字段对RepresentativeCases的元素分组,确保每个分组内的元素这两个属性值完全一致 Into g = Group是给每个分组的元素集合起个名字g,后续可以通过g访问该分组下的所有元素。这和C#里group w by new {w.PublicSubType, w.LawArea} into g的作用完全等价,只是VB需要显式通过Into指定分组集合的变量名,C#则直接用into g完成命名。
二、C#代码编译失败的原因及修正
你写的where g.Count(x => x.PublicSubType.Distinct().Count()) > 100有两个核心问题:
- 语法错误:
x.PublicSubType是单个RepresentativeCase对象的属性值,不是集合,而Distinct()是针对IEnumerable<T>的扩展方法,不能直接给单个值调用,这是编译失败的直接原因。 - 逻辑错误:因为你是按
PublicSubType和LawArea分组的,每个分组内所有元素的这两个属性值都相同,所以分组内PublicSubType的去重数量永远是1,原VB代码的写法本身逻辑就不合理,属于笔误。
修正后的代码(分两种常见意图)
意图1:过滤元素总数≥100的分组
如果原VB代码是想保留元素数量超过100的分组,正确的C#代码是:
List<RepresentativeCase> query = ( from w in this.RepresentativeCases where w.Active == true group w by new { w.PublicSubType, w.LawArea } into g where g.Count() >= 100 select g.First() ).ToList();
意图2:过滤分组内某属性去重数量≥100的分组
如果是想统计分组内其他属性(比如CaseId)的去重数量,代码调整为:
List<RepresentativeCase> query = ( from w in this.RepresentativeCases where w.Active == true group w by new { w.PublicSubType, w.LawArea } into g where g.Select(x => x.CaseId).Distinct().Count() >= 100 select g.First() ).ToList();
内容的提问来源于stack exchange,提问作者AngryHacker
相关产品推荐
相关产品推荐

