Можно ли перегруппировать результат использования LINQ GroupBy ()? - PullRequest
2 голосов
/ 28 июня 2010

Если я использовал метод LINQ GroupBy () для создания сгруппированного перечисления, возможно ли перегруппировать этот результат в другую систему ключей?То есть, если я сгруппировал все объекты по свойству X для одной части кода, можно ли впоследствии сгруппировать эту коллекцию по свойству Y свойства X на более позднем этапе кода?

Ответы [ 2 ]

4 голосов
/ 28 июня 2010

Я не читал ваш вопрос, но это работает:

var groupedByProperty1 = myEnumerable.GroupBy(x => x.Property1);

var groupedByProperty2 = groupedByProperty1.SelectMany(g => g)
                                           .GroupBy(x => x.Property2);

Это то, что вы ищете случайно?

0 голосов
/ 29 декабря 2010

Этот немного более сложный способ может быть полезен в некоторых случаях:

  • Ключ 'столбцы' не присутствует в самих элементах данных
  • Вы хотите создать новый ключнепосредственно по существующему, сгруппированному по ключу.

Я обнаружил, что мне нужно перегруппировать на основе дополнительных критериев, которые были слишком сложными для выражения Linq-SQL, и это подход, который я предложил для этой ситуации.

Основное, что я делаю:

  • Сведение списка элементов в новый список пар ключ-значение, содержащих существующий ключ + элемент данных
  • Перегруппировка основана на вашем новом ключе - который напрямую основан на существующем ключе

Примечание. Я создал объект DateTime_PaymentStatus для представления ключа.Если вы сделаете это, обязательно добавьте метод Equals() в класс, иначе вы не получите фактической группировки!

 // sample to regroup based on modifying an existing key
 var regrouped = grouped. 

                        SelectMany(x => // each x is an individual grouping (Key + List) 

                            // flatten the list, retaining the key each item was grouped by
                            x.Select(y => new 
                            { 
                                Key = x.Key, 
                                Item = y
                            })).

    // regroup based upon the existing key
    GroupBy(x => new DateTime_PaymentStatus 
            { 
                // group based on date + payment status
                Date = x.Key.Date, 
                PaymentStatus = PaidOrUnpaid(x.Key.PaymentStatus)   // call function here that is not SQL compatible
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...