Суммируйте произвольные данные с помощью LINQ - PullRequest
0 голосов
/ 03 марта 2011

В C # дано определение класса следующим образом:

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

и учитывая набор SomeObject s, я хочу, чтобы мое приложение могло подсчитывать количество SomeObjects, сгруппированных по любой комбинации A, B и C. Есть ли запрос LINQ, который я могу использовать для этого, или если нет, какой алгоритм я могу написать?

Учитывая это:

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

Я хочу сгруппировать objects по SomeObject.A, если GroupByA имеет значение true, по B, если GroupByB имеет значение true, и C, если GroupByC имеет значение true. Я понимаю, что могу сделать любой один из них по 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 ]

2 голосов
/ 03 марта 2011
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 голос
/ 03 марта 2011

Вы можете группировать по анонимному типу с двумя свойствами:

objects.GroupBy(o => new { o.A, o.B });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...