Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询以显示带有group by和count的结果网格_C#_Linq - Fatal编程技术网

C# Linq查询以显示带有group by和count的结果网格

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

我正在处理一个涉及分组和计数的LINQ查询,希望有人能提供帮助

我的模型是:

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