2013-11-27 4 views
0

Прошу прощения, если это дублирующий вопрос. Если он повторяется, сообщите мне, где я могу его найти.Как обрабатывать результаты группировки столбцов нескольких столбцов

Мне трудно понять концепцию группировки, особенно, как обрабатывать результаты группировки. Может ли кто-нибудь объяснить мне, как обрабатывать результаты многоколоночной группировки словарей.

У меня есть словарь типа

Dictionary<string, AsynchRunItem2> AsynchRunItems. 

строка является ключом, который мы генерируем с помощью 4 других свойств.

AsynchRunItem2 имеет следующие свойства:

string UniverseIDs; 

DateTime StartDate; 

DateTime EndDate; 

В AsynchRunItems, я получаю четыре записи. См. Ниже значения. Я оставил Ключи.

UniverseIDs:15 StartDate:10/9/2013 EndDate : 10/31/2013

UniverseIDs:20 StartDate:10/9/2013 EndDate : 10/31/2013

UniverseIDs:50,55 StartDate:09/30/2013 EndDate : 10/31/2013

UniverseIDs:60,64 StartDate:09/30/2013 EndDate : 10/31/2013

Я хочу, чтобы сгруппировать AsynchRunItems на StartDate и EndDate, так что я могу получить, как показано ниже, используя лямбда не LinQ пожалуйста.

UniverseIDs:15,20 StartDate:10/9/2013 EndDate : 10/31/2013

UniverseIDs:50,55,60,64 StartDate:09/30/2013 EndDate : 10/31/2013

Я группируя, как показано ниже, но хочу знать, как я могу обрабатывать группирование результатов

var temp = AsynchRunItems.GroupBy(g => new { g.Value.StartDate,g.Value.EndDate}); 

Я хочу знать, как двигаться вперед и работать на темп, так что Я могу получить то, что хочу.

+0

Вам нужно значение ключа «string» с 'AsyncRunItems' в будущем? –

ответ

0

GroupBy возвращает коллекцию объектов IGrouping, где каждый объект IGrouping имеет свойство Key, а также сам набор - набор элементов из исходной коллекции (AsynchRunItems). Таким образом, вы можете увидеть возвращение GropyBy в виде коллекции коллекций, и вы можете делать такие вещи, как цикл через коллекцию объектов IGrouping, или циклически перебирать элементы, сгруппированные в определенные объекты IGrouping. Или вы можете использовать функции расширения Enumerable для работы с любым из них.

Возможно, вы сбиты с толку тем фактом, что оригинальная коллекция - это словарь. Поскольку словарь представляет собой набор объектов KevValuePair, каждый объект IGrouping, возвращаемый вашим методом GroupBy, представляет собой набор объектов KeyValuePair того же типа. Это может быть легче понять, если вы сделали это:

  var groupedAsynchRunItems 
       = AsynchRunItems.GroupBy(kvp => kvp.Key) 
        .Select(g => g.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)); 

Это возвращает коллекцию, где каждый IGrouping был преобразован в словарь. Делая это, вы потеряете свойство Key объектов IGrouping. Действительно, единственная причина, по которой вы должны это сделать, - это использовать функциональность членов класса Dictionary. Я предлагаю это только как узнать, как работает IGrouping. Мы могли бы даже пойти один лучше здесь:

var groupedAsynchRunItems 
      = AsynchRunItems.GroupBy(kvp => kvp.Key) 
       .ToDictionary(g => g.Key, g => g.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)); 

Это дает вам Словарь словарей, который может помочь показать, как возвращаемое значение метода GroupBy уже вроде как словарь.

+0

Спасибо. У меня появилось больше об этом. – Ziggler

0

Если вы просто хотите, чтобы отобразить результаты, как вы их группировать (что, безусловно, выполнимо с текущим GroupBy() методом), просто сделать что-то вроде этого:

foreach(var t in temp) 
{ 
    Console.WriteLine("UniverseIDs: {0} StartDate:{1} EndDate: {2}", string.Join(", ", t.ToList().Select (x => x.Value.UniverseIDs).ToArray()), t.Key.StartDate, t.Key.EndDate); 
} 

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

UniverseIDs: 15, 20 StartDate: 10/9/2013 EndDate: 10/31/2013
UniverseIDs: 50, 55, 60, 64 StartDate 9/30/2013 EndDate: 10/31/2013

Если вы смущены тем, что содержится в переменной темпа, см. Ответ Тони.

Смежные вопросы