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