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

时间:2016-11-29 14:19:05

标签: c# 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(),但我认为上面的代码更快 如果可能的话,我正在寻找更快的替代解决方案。 谢谢你的回答

4 个答案:

答案 0 :(得分:4)

你可以用这个:

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

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

答案 1 :(得分:2)

您可以计算x中有多少项目的区域等于&#34; M&#34;

 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

P.S。我想知道为什么这么多人喜欢使用Lists而不是数组。

答案 2 :(得分:2)

好吧,你至少可以重复使用第一个查询:

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();

答案 3 :(得分:0)

如果你真的想确保只有一次你可以使用.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;