C # & Linq: группировка списка членов по списку значений - PullRequest
2 голосов
/ 13 января 2012

У меня есть список объектов, которые все предоставляют свойство типа IList.Теперь я хочу сгруппировать этот список по значениям этого списка.Так скажем, например:

OB1: Property is A, B, C  
OB2: Property is D, C, E  
OB3: Property is B, E, C

В качестве вывода я хотел бы получить

A: OB1  
B: OB1, OB3  
C: OB1, OB2, OB3  
D: OB2  
E: OB2, OB3

Я подумал о удобном выражении LINQ для решения этой проблемы, но он не смог найти никакой ссылки, еслиэто возможно вообще.Конечно, я могу сделать это с помощью циклов ... но мне было бы интересно, если это возможно с LINQ.

Спасибо

Ответы [ 4 ]

1 голос
/ 13 января 2012

Образец для LINQPad :

var original = new[]
{
    new { Name = "OB1", Property  = new [] { "A", "B", "C" } },
    new { Name = "OB2", Property  = new [] { "D", "C", "E" } },
    new { Name = "OB3", Property  = new [] { "B", "E", "C" } },
};

var output = original
    .SelectMany(o => o.Property, (o, i) => new { Name = o.Name, Item = i })
    .GroupBy(e => e.Item);
1 голос
/ 13 января 2012

Предполагая структуру, подобную этой:

var list = new [] {
  new {Name="OB1", Prop=new[]{"A", "B", "C"}},
  new {Name="OB2", Prop=new[]{"D", "C", "E"}},
  new {Name="OB3", Prop=new[]{"B", "E", "C"}},
}

Вы можете написать следующее понимание запроса:

from ob in list
let Name = ob.Name
from val in ob.Props
group ob.Name by val

Если вы хотите отобразить непосредственно объекты, а не только их имена, сделайтеэто вместо:

from ob in list
from val in ob.Props
group ob by val
0 голосов
/ 13 января 2012
var list = new[] {
              new {Name="OB1", Prop=new[]{"A", "B", "C"}},
              new {Name="OB2", Prop=new[]{"D", "C", "E"}},
              new {Name="OB3", Prop=new[]{"B", "E", "C"}},
            };

var props = from prop in (from item in list
                          from p in item.Prop
                          select p).Distinct()
            let names = list.Where(i => i.Prop.Contains(prop)).Select(i => i.Name).ToArray()
            select new { prop, names };
0 голосов
/ 13 января 2012

Вы можете попробовать:

list
  .SelectMany(x => x.Property.Select(p => new { Key = p, Value = x }))
  .GroupBy(p => p.Key)
  .Select(g => new { g.Key, Values = g.Select(x => x.Value).ToList() } )
...