C# 检查是否使用linq连接列表计数

C# 检查是否使用linq连接列表计数,c#,.net,linq,lambda,linq-to-entities,C#,.net,Linq,Lambda,Linq To Entities,各州都有城市。只有在没有平局的情况下,我才需要大多数城市的状态。平局意味着前两个州拥有相同数量的城市 var stateWithMostCities = _states .OrderByDescending(_p => _p.cities.Count()) .Take(2) .ToList(); 现在我可以检查第一州的城市数是否等于第二州,并确定是否存在平局。然而,我想知道,如果使用takewhile、skip和其他创造性地使用linq,是否可以在上面显示的同一行上实现这一点

各州都有城市。只有在没有平局的情况下,我才需要大多数城市的状态。平局意味着前两个州拥有相同数量的城市

var stateWithMostCities = _states
  .OrderByDescending(_p => _p.cities.Count())
  .Take(2)
  .ToList();
现在我可以检查第一州的城市数是否等于第二州,并确定是否存在平局。然而,我想知道,如果使用takewhile、skip和其他创造性地使用linq,是否可以在上面显示的同一行上实现这一点。谢谢诸如此类的事

var stateWithMostCitiesWithoutATie =_states.GroupBy(_p => _p.cities.Count())
                                           .OrderByDescending(g=>g.Key)
                                           .FirstOrDefault(g=> g.Count()==1? g.First():null);

关键是,正如@Mong Zhu向Group by counts of cities指出的那样,在这之后,您可以按desc订购以获得最大值,如果最大值组有多个,那么您在技术上有一个平局,您可以在有序状态上使用聚合:

// the state with maximum cities; null in case of tie
var stateWithMostCities = _states
  .OrderByDescending(state => state.cities.Count())
  .Take(2) // at most 2 items to analyze     
  .Aggregate((s, a) => s.cities.Count() == a.cities.Count() ? null : s);

但我怀疑你是否应该这样做:比较顶部
2
状态更具可读性。

“只有在没有平局的情况下。”你如何定义
else
条件?你还需要什么?如果顶部打成平局怎么办?你知道下两个吗?我建议按城市数分组。如果您找到的最大计数超过1个条目,则说明情况相同。谢谢您的回答。@octaviocci,我不得不将第3行更改为.Selectt(g=>g.count()==1?g.First():null)。ToList().FirstOrDefault(),因为我无法找出一些奇怪的linq suntax错误。仅供他人参考。无EF。错误类似于“错误CS1662无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回..”,谢谢。是,如果这是唯一的方法,则手动比较更具可读性。然而,由于linq链接应该让我更具可读性,我在排序列表->takewhile()…的行中被卡住了。如果在调用
Aggregate()
之前调用
Take(2)
,效率会更高,然后可以将聚合编写为
Aggregate((a,s)=>a.cities.Count=s.Count?null:a)@Henrik Hansen:很好的优化!谢谢,这应该是最有效的答案了。