使用LINQ汇总任意数据

时间:2011-03-03 12:20:19

标签: .net linq .net-4.0 grouping

在C#中,给出如下的类定义:

public class SomeObject
{
    public String A { get; set; }
    public String B { get; set; }
    public String C { get; set; }
}

并给出了SomeObject的集合,我希望我的应用程序能够计算按A,B和C的任意组合分组的SomeObject的数量。是否有可用于执行此操作的LINQ查询,或者如果没有,我可以编写一些算法吗?

鉴于此:

List<SomeObject> objects;
bool GroupByA;
bool GroupByB;
bool GroupByC;

如果GroupByA为真,我想通过SomeObject.A对objects进行分组,如果GroupByB为真,则由B进行分组,如果GroupByC为真,则由C进行分组。我知道我可以通过objects.GroupBy(o => o.A);执行任何一个,但之后如何按B和/或C进行分组?

我希望这是有道理的。我希望得到的是这样的:

There are 10 objects with A = "Smith" and B = "London"
There are 20 objects with A = "Jones" and B = "London"
There are 44 objects with A = "Jones" and B = "Inverness"

等。等等。提前谢谢你。

2 个答案:

答案 0 :(得分:2)

var groups = objects.GroupBy(o => new {
    A = GroupByA ? o.A : null,
    B = GroupByB ? o.B : null,
    C = GroupByC ? o.C : null
});

foreach (var g in groups)
{
    Console.WriteLine("There are {0} objects with A = {1} and B = {2} and C = {3}",
                 g.Count(),
                 g.Key.A,
                 g.Key.B,
                 g.Key.C);
}

可以使用一些更复杂的格式来处理C=null关键部分。

答案 1 :(得分:1)

您可以使用具有两个属性的匿名类型进行分组:

objects.GroupBy(o => new { o.A, o.B });