在具有GroupBy的对象列表中计算具有相同属性值的对象

时间:2018-02-07 21:42:23

标签: c# linq

我上了一堂课:

public class result
{
    public int A;
    public int B;
    public int C;
}

我列出了它:

public static List<result> results = new List<result>();

然后我用随机数据填充该列表 像10,000,000个企业的东西,其中a,b和c的值为0到24。

我想在我的控制台中显示已找到的组合以及有多少组合 在SQL中,它会像:

SELECT A, B, C, COUNT(*) AS total
FROM results
GROUP BY A, B, C

我尝试了很多东西,我想我可以写一本关于它的书。 我试过的一些东西:

var query1 = results.GroupBy(x => new { x.A, x.B, x.C }).Select(group => new { Value = group.Key, Count = group.Count() });

var query2 = from r in results group r by new { r.A, r.B, r.C } into rGroup select rGroup;

var query3 = results.GroupBy(x => new { x.A, x.B, x.C })  .Where(g => g.Count() > 1).ToDictionary(x => x.Key, y => y.Count());

var query4 = from r in results
                          group r by new { r.A, r.B, r.C } into rGroup
                          select new { key = rGroup.Key, cnt = rGroup.Count() };

但似乎没有任何效果。 我想找回一个包含a,b,c值的列表以及已找到的数量的数量。

然而我无法让它工作,我尝试了几个小时的谷歌并尝试了一切,在这一点上我完全迷失了。

2 个答案:

答案 0 :(得分:4)

为了完整起见,这是一个完整的例子。

与nlawalker相同的解决方案,产生了一个词典。

public class result
{
    public int A;
    public int B;
    public int C;

    public result(int a, int b, int c)
    {
        A = a;
        B = b;
        C = c;
    }
}

static void Main(string[] args)
{
    Random r = new Random(23);

    var data = new List<result>();
    for (int i = 0; i < 100; i++)
        data.Add(new result(r.Next(1, 3), r.Next(1, 3), r.Next(1, 3)));

    var dic = data
        .GroupBy(k => new { k.A, k.B, k.C })
        .ToDictionary(g => g.Key, g => g.Count());

    foreach (var kvp in dic)
        Console.WriteLine($"({kvp.Key.A},{kvp.Key.B},{kvp.Key.C}) : {kvp.Value}");
    Console.ReadLine();
}

输出:

(2,2,2) : 13
(1,2,2) : 11
(2,1,1) : 9
(1,1,1) : 16
(1,2,1) : 14
(1,1,2) : 15
(2,1,2) : 7
(2,2,1) : 15

答案 1 :(得分:2)

你让GroupBy部分正确 - 你只需要将组选择到另一个具有该组的A,B和C值的对象,以及该组的计数:

results.GroupBy(x => new { x.A, x.B, x.C })
    .Select(g => new { g.Key.A, g.Key.B, g.Key.C, Count = g.Count()})