Могу ли я использовать анонимный тип для этой группы Linq? - PullRequest
4 голосов
/ 07 декабря 2010

У меня есть следующий код, который создает словарь, содержащий несколько списков; каждый список можно получить с помощью цифровой клавиши.

public class myClass
{
    public string Group { get; set; }
    public int GroupIndex { get; set; }
    ...
}

public List<MyClass> myList { get; set; }

private Class IndexedGroup
{
    public int Index { get; set; }
    public IEnumerable<MyClass> Children { get; set; }
}

public Dictionary<int, IEnumerable<MyClass>> GetIndexedGroups(string group)
{
    return myList.Where(a => a.Group == group)
                 .GroupBy(n => n.GroupIndex)
                 .Select(g => new IndexedGroup { Index = g.Key, Children = g })
                 .ToDictionary(key => key.Index, value => value.Children);
}

Есть ли способ устранить класс IndexedGroup?

Я пытался использовать анонимный тип в методе Select, например:

.Select(g => new { Index = g.Key, Children = g })

но я получаю ошибку преобразования типа.

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Приведение Children из IGrouping<T> в IEnumerable<T> или явная передача общих параметров в вызов ToDictionary.

Параметр g - это IGrouping<T>, который реализует IEnumerable<T>.
В результате неявных обобщенных вызовов создается Dictionary<int, <i>IGrouping</i><MyClass>>, который не может быть преобразован в Dictionary<int, <i>IEnumerable</i><MyClass>>.

Этого избегает ваш класс IndexedGroup, поскольку его свойство Children явно типизированокак IEnumerable<MyClass>.

Например:

return myList.Where(a => a.Group == group)
             .GroupBy(n => n.GroupIndex)
             .ToDictionary<int, IEnumerable<MyClass>>(g => g.Key, g => g);

Также вас может заинтересовать интерфейс ILookup<TKey, TElement> .

2 голосов
/ 07 декабря 2010

Вы можете просто полностью избавиться от Select() и позвонить .AsEnumerable():

return myList.Where(a => a.Group == group)
             .GroupBy(n => n.GroupIndex)
             .ToDictionary(g => g.Key, g => g.AsEnumerable());

Или вы можете изменить тип возврата на ILookup, который, по сути, представляет собой структуру данныхВы собираетесь:

public ILookup<int, MyClass> GetIndexedGroups(string group)
{
    return myList.Where(a => a.Group == group)
                .ToLookup(n => n.GroupIndex);                    
}
1 голос
/ 07 декабря 2010

Как насчет следующего?

return myList.Where(a => a.Group == group)
             .GroupBy(n => n.GroupIndex)
             .ToDictionary(g => g.Key, g => g as IEnumerable<MyClass>);
...