2012-01-13 31 views
2

我有一个对象列表,所有公开的IList类型的属性。 现在我想按该列表的值将该列表分组。因此,让我们说,例如:C#&Linq:根据值列表分组列表成员

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。

感谢

回答

0

你可以试试:

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() }) 
1

样品为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

假设的结构是这样的:

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

最后一个是优雅的......好:) – 2012-01-13 11:29:33

0
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 };