C# Выберите отличные значения от IGrouping

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

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)

Решение

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

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 в каждой группе и найдет его Bar.

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

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

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

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

б. Вторая строка преобразует старый type1 в новый type2 путем создания нового списка T2.

Может быть, переборщить с твоим вопросом, просто отрежь то, что тебе не нужно.

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

var result = someGroup.SelectMany(x => x.Select(t => t.SomeBar)).Distinct();