繁体   English   中英

如何计算两个单独的条件linq

[英]how to count two seperate where condition linq

<person>
<name>Mehmet</name>
<date>25.07.1974</date>
<region>M</region>


假设有一个XML文件,其中包含要计数的文件
-出生日期在2000年之前的人,以及
-出生日期在2000年之前和M区的人

我可以得到如下计数。

int x = List.Where( x=> x.Date < dateTime2000 ).Count();

int y = List.Where( x=> x.date < dateTime2000 && x.region == "M" ).Count();

以上的执行速度很快。
但是有同样的夸奖,我觉得那还不行。
我不计算ToList()和ToArray(),但我认为上述代码更快。
如果可能,我正在寻找更快的替代解决方案。 谢谢答案

您可以使用此:

var prior2000 = List.Where(x => x.Date < dateTime2000).ToList();
var x = prior2000.Count;
var y = prior2000.Count(x => x.region == "M");

这只会循环第一个查询的结果,而不是所有元素。

您可以计算x中有多少个项目的区域等于“ M”

 var itemsBefore2000 =  List.Where( x=> x.Date < dateTime2000 ).ToArray();
 int x = itemsBefore2000.Length;
 int y = itemsBefore2000.Where( x=> x.region == "M" ).ToArray().Length; 
         // or
         itemsBefore2000.Count( x=> x.region == "M" ); // this one is preferable

PS我想知道为什么这么多人喜欢使用列表而不是数组。

好吧,您至少可以将第一个查询重用于两个计数:

var birthPrio2000 = List.Where( x=> x.Date < dateTime2000 ).ToList();
int countBirthPrio2000 = birthPrio2000.Count;
int countBirthPrio2000RegionM = birthPrio2000.Count(x => x.region == "M");

使用查找的另一种方法(类似于字典):

var birthPrio2000Regions = List.Where(x => x.Date < dateTime2000).ToLookup(x => x.Region);
int prio2000_TotalCount = birthPrio2000Regions.Sum(g => g.Count());
int prio2000_RegionM_Count = birthPrio2000Regions["M"].Count();

如果您确实想确保仅对源进行一次迭代,则可以使用.Aggregate()函数并对自己进行逻辑处理:

var desiredValues = persons.Aggregate(
    new { All = 0, InRegion = 0 }, 
    (sum, person) => new
    {
        All = person.Date < dateTime2000 ? sum.All + 1 : sum.All,
        InRegion = person.Region == "M" ? sum.InRegion + 1 : sum.InRegion
    });

var prio2000_TotalCount = desiredValues.All;
var prio2000_RegionM_Count = desiredValues.InRegion;

暂无
暂无

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

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