При использовании GroupBy в linq, как я могу получить список имен групп? - PullRequest
1 голос
/ 24 июня 2011

Если в исходной коллекции есть объекты со свойством prop:

prop = "a";
prop = "a";
prop = "b";
prop = "b";
prop = "c";

и я группирую по подпорке, мне нужен вывод:

List<string>{ "a", "b", "c" }

Ответы [ 7 ]

3 голосов
/ 24 июня 2011

ОБНОВЛЕНО

Мой первоначальный ответ об использовании только Disticnt () недостаточен. Вам необходимо сгруппировать значение prop , а затем выбрать первого члена каждого подмножества:

myList.GroupBy(i => i.prop).Select(i => i.First()).ToList().ForEach(i => Console.Write(i.prop + ", "));

Демо-код

Вот некоторый код, который иллюстрирует группировки.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var myList = new List<Foo>() { 
                new Foo(){ prop = "a", anotherProp = "z"},
                new Foo(){ prop = "a", anotherProp = "x"},
                new Foo(){ prop = "b", anotherProp = "x"},
                new Foo(){ prop = "b", anotherProp = "y"},
                new Foo(){ prop = "c", anotherProp = "z"}
            };

            // Display groups.
            myList.GroupBy(i => i.prop).ToList().ForEach(j =>
            {
                Console.WriteLine("\t");
                j.ToList().ForEach(k => Console.Write(k.prop + ", "));
            });

            Console.WriteLine();
            Console.WriteLine(new string('-', 25));

            // Display desired output.
            myList.GroupBy(i => i.prop).Select(i => i.First()).ToList().ForEach(i => Console.Write(i.prop + ", "));
            Console.WriteLine();
        }
    }
    public class Foo
    {
        public string prop { get; set; }
        public string anotherProp { get; set; }
    }
}
3 голосов
/ 24 июня 2011

например.

public class Foo
{
    public string PropertyA { get; set; }
    public string PropertyB { get; set; }
}

следующий код для группы:

var foos = new List<Foo>();
var groupings = from foo in foos
                group foo by foo.PropertyA
                into groupedFoos
                select groupedFoos;
/*
// the same as
var groupings = foos.GroupBy(foo => foo.PropertyA);
*/
var keys = from grouping in groupings
           select grouping.Key;

.GroupBy() вернется IEnumerable<IGrouping<TKey, TSource>>

Если вы просто хотите различить свойства, вы можете перейти к .Distinct(), например:

var keys = (from foo in foos
            select foo.PropertyA).Distinct();
1 голос
/ 24 июня 2011

Если вы предпочитаете:

stuff.GroupBy(e => e.prop).Select(group => group.Key)
0 голосов
/ 24 июня 2011
List<MyClass> source = getSource();

List<IGrouping<KeyType, MyClass>> groups = source
  .GroupBy(x => x.prop)
  .ToList();

List<KeyType> keys = groups
  .Select(g => g.Key)
  .ToList();
0 голосов
/ 24 июня 2011
var q = from a in yourList 
group a by a.prop into b
select b.Key;
0 голосов
/ 24 июня 2011
List<strings> groups context.YourObjects.Select(o => o.prop).Distinct().ToList();
0 голосов
/ 24 июня 2011

Использование группировки по дает только отдельные элементы по вашей функции сравнения. если сравнение выполнено с помощью prop, оно вернет объекты только с prop. все, что вам нужно сделать, это перебрать их и выбрать только prop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...