2013-03-18 1 views
0

У меня есть массив пользовательских объектов (PONO), называемый FrameList, я могу упорядочитьBy и GroupBy для сортировки и группировки. Но теперь я хочу, чтобы вернуть словарь, и я получаю сообщение об ошибке: (. Не BTW, там нет ошибок, я удалить метод .ToDictionary())Linq сортировка, группировка и возврат словаря

Error 1 'System.Linq.IGrouping' does not contain a definition for 'type' and no extension method 'type' accepting a first argument of type 'System.Linq.IGrouping' could be found (are you missing a using directive or an assembly reference?) C:\Users\ysg4206\Documents\Visual Studio 2010\Projects\Watson\CatalogServiceClasses\BuildToby.cs 21 38 Watson

Вот фрагмент кода, который сортирует и группы:

var dict = request.FrameList.OrderBy(f => f.trueDate) 
     .GroupBy(f => f.type) 
     .ToDictionary(f => f.type, f => f); 

и вот определение FrameList (который представляет собой простой массив FrameData)

[DataContract] 
public class FrameData 
{ 
    [DataMember] 
    public String idx { get; set; } 
    [DataMember] 
    public String type { get; set; } 
    [DataMember] 
    public String path { get; set; } 
    [DataMember] 
    public String date { get; set; } 
    [DataMember] 
    public DateTime trueDate { get; set; } 
} 
+0

'.ToDictionary (е => f.Key, е => е)' IGrouping будет сгруппировать элементы по типу в ключе , – Romoku

ответ

3

Это не ясно, что вы пытаясь сделать.

Если вы просто хотите создать идиоматическое мульти-карту, попробуйте:

var lookup = request.FrameList.ToLookup(f => f.type); 

Если вы хотите, чтобы создать мульти-карту с Dictionary класса, попробуйте:

var dict = request.FrameList 
        .GroupBy(f => f.type) 
        .ToDictionary(g => g.Key, g => g.ToList()); 

Обратите внимание, что в обоих случаях OrderBy до группировки бесполезен, так как Lookup и Dictionary являются неотъемлемо неупорядоченными коллекциями. Если вы пытаетесь выполнить что-то с вашим заказом (возможно, вы хотите, чтобы элементы в группе были заказаны по дате?), Пожалуйста, уточните, и мы могли бы предоставить что-то более подходящее.

EDIT: Основываясь на ваш комментарий, выглядит как вам нужно:

var dict = request.FrameList 
        .GroupBy(f => f.type) 
        .ToDictionary(g => g.Key, 
           g => g.OrderBy(f => f.trueDate) 
             .ToList()); 
+0

+1 для использования 'ToLookup'. Дамм, я забыл об этом ... –

+0

Да, это то, что я искал. Спасибо. OrderBy необходимо не сортировать группы (или элементы-диктаторы), а скорее, чтобы список, который находится в каждом ключе, был отсортированным списком (по дате). И это трюк. –

1

Если предположить, что сигнатура метода является IDictionary<string,IList<FrameData>>

Попробуйте использовать следующий фрагмент кода:

var dict = request.FrameList 
    .OrderBy(f => f.trueDate) 
    .GroupBy(f => f.type) 
    .ToDictionary(f => f.Key, f => f.ToList()); 
+0

Ответа на этот вопрос отредактировал? ;) –

+0

@lazyberezovsky Я был смущен комментарием к ответу :) –

1

оператор GroupBy возвращает IGrouping объекты. Эти объекты имеют Key. Но нет type собственности на объект группировки (его свойство вашей организации):

var dict = request.FrameList 
     .OrderBy(f => f.trueDate) 
     .GroupBy(f => f.type) // this selects IEnumerable<IGrouping> 
     .ToDictionary(g => g.Key, g => g); 

ПРИМЕЧАНИЕ: Если это Linq к Entities запроса, то GroupBy возвращает IQueryable<IGrouping<TKey, TElement>>