C # Выберите отличительные значения от IGrouping - PullRequest
3 голосов
/ 26 февраля 2009

У меня есть два класса:

class Foo 
{ 
    public Bar SomeBar { get; set; } 
}

class Bar
{ 
    public string Name { get; set; } 
}

У меня есть список Foos, которые я группирую вместе:

var someGroup = from f in fooList
                orderby f.SomeBar.Name ascending
                group f by f.SomeBar.Name into Group
                select Group;

Как я могу получить список отдельных баров от someGroup?

Ответы [ 3 ]

7 голосов
/ 26 февраля 2009

Будет ли потенциально несколько баров с одинаковым именем? Если так, это сложно. Если нет, вы можете просто изменить его на:

var grouped = from f in fooList
              orderby f.SomeBar.Name ascending
              group f by f.SomeBar into Group
              select Group;

var bars = grouped.Select(group => group.Key);

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

var someGroup = from f in fooList
                orderby f.SomeBar.Name ascending
                group f by f.SomeBar.Name into Group
                select Group;

var bars = someGroup.Select(group => group.First().SomeBar);

Это займет первое Foo в каждой группе и найдет его Бар.

0 голосов
/ 17 июля 2012

Люди задавали подобные вопросы раньше, поэтому я сделал это, объединив знания каждого:

var newlist<T2> = oldlist<T1>.GroupBy(g => g.distinct_var).Select(g => g.First()) //a
                 .Select(r=> new T2() {var1=r.va1, var2=r.var2 ...etc}).ToList(); //b

Что он делает:

а. Первая строка выбирает различные элементы по вашему выбору, что вы и хотели.

б. Вторая строка преобразует старый тип 1 в новый тип 2, создав новый список T2.

Может быть, перебил на ваш вопрос, просто отрубите вещи, которые вам не нужны.

0 голосов
/ 26 февраля 2009

Если вы определяете «отличимость» в специальной реализации Equals для Bar, вы можете использовать:

var result = someGroup.SelectMany(x => x.Select(t => t.SomeBar)).Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...