C# Linq查询以显示带有group by和count的结果网格
我正在处理一个涉及分组和计数的LINQ查询,希望有人能提供帮助 我的模型是:C# Linq查询以显示带有group by和count的结果网格,c#,linq,C#,Linq,我正在处理一个涉及分组和计数的LINQ查询,希望有人能提供帮助 我的模型是: Class Person { public string Name public string Company public string Role } 我的数据是: Person1 IBM Technician Person2 IBM Analyst Person3 Microsoft Engineer Person4 Micr
Class Person
{
public string Name
public string Company
public string Role
}
我的数据是:
Person1 IBM Technician
Person2 IBM Analyst
Person3 Microsoft Engineer
Person4 Microsoft Analyst
Person5 Apple Analyst
我想要的输出是:
Technician Engineer Analyst Total
IBM 1 0 1 2
Microsoft 0 1 1 2
Apple 0 0 1 1
=========================================
1 1 3 5
有人能帮忙吗?您可以定义一个扩展方法
var result = from person in persons
group person by new { person.Role, person.Company }
into g
select new { Role = g.Key, Company = g.Key.Company, Count = g.Count(item => item.Company == g.Key.Company )};
var countRole = result.Count(item => item.Role.Role == "Analyst"); // output: 3
var total = result.Count(); // output: 5
var countCompany = result.Count(item => item.Company == "IBM"); // output: 2
public static class Extensions
{
public class Table<Column, Row>
{
public List<Column> Columns;
public List<Row> Rows;
public List<List<int>> Cells;
public List<int> ColTotals;
public List<int> RowTotals;
}
private static List<P> GetValues<T, P>(IEnumerable<T> source, Func<T, P> selector)
{
return source.Select(selector).OrderBy(x => x).Distinct().ToList();
}
public static Table<Column, Row> ToTable<T, Column, Row>(this IEnumerable<T> source, Func<T, Column> columnSelector, Func<T, Row> rowSelector)
{
var cols = GetValues(source, columnSelector);
var rows = GetValues(source, rowSelector);
var cells = rows.Select(r => cols.Select(c => source.Count(x => columnSelector(x).Equals(c) && rowSelector(x).Equals(r))).ToList()).ToList();
return new Table<Column, Row>()
{
Columns = cols,
Rows = rows,
Cells = cells,
ColTotals = cols.Select((x, i) => cells.Sum(c => c[i])).ToList(),
RowTotals = cells.Select(x => x.Sum()).ToList(),
};
}
}
var table = GetPersons().ToTable (p => p.Role, p => p.Company);