Выражение Linq для организации (вроде как Group By, но другое)

Допустим, у меня довольно большой IList<foo> где foo выглядит так:

public class foo
{
    public string Region { get; set; }
    public string Territory { get; set; }
    public string Location { get; set; }
    public string Person { get; set; }
}

... есть ли способ, используя достаточно быстрое / эффективное выражение, "сгруппировать" эти элементы foo по Regionтак что я мог бы в конечном итоге с IDictionary<string, IList<foo>> и иметь string ключ быть Region собственность, с каждым подчиненным IList<foo> содержащий только foo записи, которые соответствуют этому региону? (это не должно быть IDictionary, это просто, чтобы проиллюстрировать суть того, что я пытаюсь сделать.) Я хочу представить интерактивный список моему представлению MVC, организованному подобным образом, без необходимости писать что-то относительно сложное или использовать стороннюю библиотеку.

3 ответа

Решение

Да - хочешь Lookup:

var lookup = list.ToLookup(x => x.Region);

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

IList<Foo> foos = //whatever
var groups = foos
    .GroupBy(f => f.Region)
    .ToDictionary(grp => grp.Key, grp => grp.ToList());
IList<Foo> foos = //whatever

var groups = foos.ToLookup(f => f.Region);

ILookup<T> похоже на словарь, но каждый ключ ссылается на список значений вместо одного.

Другие вопросы по тегам