C# 如何使用LINQ group by with where子句
我有一份数据清单,如下所述:C# 如何使用LINQ group by with where子句,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我有一份数据清单,如下所述: From To Gender departure date Delhi Mumbai M 16-Feb-18 Delhi Mumbai M 16-Feb-18 Delhi Mumbai F 16-Feb-18 Delhi Mumbai C 16-Feb-18 Mumbai Mohili F
From To Gender departure date
Delhi Mumbai M 16-Feb-18
Delhi Mumbai M 16-Feb-18
Delhi Mumbai F 16-Feb-18
Delhi Mumbai C 16-Feb-18
Mumbai Mohili F 16-Feb-18
Mumbai Mohili M 16-Feb-18
Mumbai Mohili C 16-Feb-18
我想根据From
和to
列对该列表进行分组,并通过LINQ计算每组中有多少男性、女性和儿童。我怎样才能做到这一点。
我这样分组,但现在如何计算男性和女性的数量
var list = result.Journey.GroupBy(x => new { x.From, x.To });
试试下面的代码
var list = travelars.GroupBy(x => new { x.From, x.To }).ToList().Select(e => new {
MaleCount = e.Count(g => g.Gender == "M"),
FemaleCount = e.Count(g => g.Gender == "F"),
ChildCount = e.Count(g => g.Gender == "C"),
});
需要知道的重要一点是
GroupBy
的返回类型是i分组
。此分组是可枚举的,并在枚举时生成元素。因此,分组可以作为任何其他可枚举项进行LINQ查询
var query = result.Journey
.GroupBy(x => new { x.From, x.To })
.Select(g => new
{
From = g.Key.From,
To = g.Key.To,
MCount = g.Count(x => x.Gender == "M"),
FCount = g.Count(x => x.Gender == "F"),
CCount = g.Count(x => x.Gender == "C")
});
您似乎不理解
GroupBy
返回的内容。它返回一组分组。每个i分组
本身就是该组中事物的i可数
我建议你做的是再次按性别分组!这样,即使已将新性别添加到模型中,也不必添加代码来计算新性别
// using the new C# 7 tuple syntax!
foreach(var group in Journeys.GroupBy(x => (x.To, x.From))) {
Console.WriteLine($"People traveling from {group.Key.Item1} to {group.Key.Item2}:");
foreach (var subgroup in group.GroupBy(x => x.Gender)) {
Console.WriteLine($"{subgroup.Key}: {subgroup.Count()} people");
}
}
你可以试试这个
List<Journey> list = new List<Journey>();
list.Add(new Journey() {From="Delhi",To="Mumbai",Gender=Gender.MALE });
list.Add(new Journey() { From = "Delhi", To = "Mumbai", Gender = Gender.MALE });
list.Add(new Journey() { From = "Delhi", To = "Mumbai", Gender = Gender.FEMALE });
list.Add(new Journey() { From = "Delhi", To = "Mumbai", Gender = Gender.CHILD });
list.Add(new Journey() { From = "Delhi", To = "Mumbai", Gender = Gender.MALE });
list.Add(new Journey() { From = "Delhi", To = "Mumbai", Gender = Gender.MALE });
list.Add(new Journey() { From = "Mumbai", To = "Mohili", Gender = Gender.FEMALE });
list.Add(new Journey() { From = "Mumbai", To = "Mohili", Gender = Gender.CHILD });
list.Add(new Journey() { From = "Mumbai", To = "Mohili", Gender = Gender.CHILD });
var grp = list.GroupBy(s => new { s.From, s.To }).ToDictionary(d => d.Key, d => d.Select(i=>new JourneyCalc { From=i.From,To=i.To,Gender=i.Gender}).ToList());
foreach (var item in grp)
{
var str = from val in item.Value group val by val.Gender into itmgrp select new JourneyCalc { Gender = itmgrp.Key, JourneyCount = itmgrp.Count() };
foreach (JourneyCalc jc in str)
{
Console.WriteLine(value: $"{item.Value[0].From} - {item.Value[0].To} => {jc.Gender} - {jc.JourneyCount}");
}
}
public class JourneyCalc
{
public string From { get; set; }
public string To { get; set; }
public Gender Gender { get; set; }
public int JourneyCount { get; set; }
}
public enum Gender
{
MALE,
FEMALE,
CHILD
}
public class Journey
{
public string From { get; set; }
public string To { get; set; }
public Gender Gender { get; set; }
}
Output:
Delhi - Mumbai => MALE - 4
Delhi - Mumbai => FEMALE - 1
Delhi - Mumbai => CHILD - 1
Mumbai - Mohili => FEMALE - 1
Mumbai - Mohili => CHILD - 2
List List=新列表();
添加(新旅程(){From=“德里”,To=“孟买”,Gender=Gender.MALE});
添加(新旅程(){From=“德里”,To=“孟买”,Gender=Gender.MALE});
添加(新旅程(){From=“德里”,To=“孟买”,Gender=Gender.FEMALE});
添加(新旅程(){From=“德里”,To=“孟买”,Gender=Gender.CHILD});
添加(新旅程(){From=“德里”,To=“孟买”,Gender=Gender.MALE});
添加(新旅程(){From=“德里”,To=“孟买”,Gender=Gender.MALE});
添加(新旅程(){From=“孟买”,To=“Mohili”,Gender=Gender.FEMALE});
添加(新旅程(){From=“Mumbai”,To=“Mohili”,Gender=Gender.CHILD});
添加(新旅程(){From=“Mumbai”,To=“Mohili”,Gender=Gender.CHILD});
var grp=list.GroupBy(s=>new{s.From,s.To}).ToDictionary(d=>d.Key,d=>d.Select(i=>newjourneycalc{From=i.From,To=i.To,Gender=i.Gender}).ToList();
foreach(grp中的var项目)
{
var str=from val in item.Value group val by val.Gender to itmgrp选择new JourneyCalc{Gender=itmgrp.Key,JourneyCount=itmgrp.Count()};
foreach(str中的JourneyCalc jc)
{
Console.WriteLine(值:$“{item.value[0]。From}-{item.value[0]。To}=>{jc.Gender}-{jc.JourneyCount}”);
}
}
公共类日志计算
{
来自{get;set;}的公共字符串
{get;set;}的公共字符串
公共性别{get;set;}
public int JourneyCount{get;set;}
}
公共枚举性别
{
男,,
女,,
小孩
}
公务舱旅程
{
来自{get;set;}的公共字符串
{get;set;}的公共字符串
公共性别{get;set;}
}
输出:
德里-孟买=>男-4
德里-孟买=>女性-1
德里-孟买=>儿童-1
孟买-Mohili=>女性-1
孟买-Mohili=>儿童-2
linq to entities]如何处理使用该ToList
调用拆分查询?它(A)加载键并对计数发出后续3*N查询,还是(B)使用元素加载组并通过枚举计算其余的。当一个查询解决方案可用时,任何一种方法对我来说都是错误的。@AmyB它将用元素加载组,并通过枚举计算其余的元素
,我不得不对查询进行轻微更改,结果成功了。下面是更新后的查询。var list=travelars.GroupBy(x=>new{x.From,x.To}).ToList().Select(e=>new{malecont=e.Count(g=>g.Gender==“M”)、femalecont=e.Count(g=>g.Gender==“F”)、ChildCount=e.Count(g=>g.Gender==“C”)、};非常感谢你的邀请help@AshwiniKumar那么改变呢?如何接受它作为答案,因为它确实帮助了我如果我也在这个列表中添加了class列,其中每一行都属于一个类,比如a、B、C、D,那么在应用GroupBy on和to列之后,我如何获得每个类中的男性、女性和儿童的计数?