Вот мои 2 класса
public class Item { public string Path { get; set; } public List<Sub> Subs { get; set; } } public class Sub { public string Name { get; set; } } private void Test() { Sub sub1 = new Sub() { Name = "SUB1" }; Sub sub2 = new Sub() { Name = "SUB2" }; Sub sub3 = new Sub() { Name = "SUB3" }; Item item1 = new Item() { Path = "/Path1" }; Item item2 = new Item() { Path = "/Path2" }; Item item3 = new Item() { Path = "/Path3" }; item1.Subs.Add(sub1); item1.Subs.Add(sub2); item2.Subs.Add(sub1); item2.Subs.Add(sub3); item3.Subs.Add(sub1); item3.Subs.Add(sub2); item3.Subs.Add(sub3); List<Item> items = new List<Item>(); items.Add(item1); items.Add(item2); items.Add(item3); }
Я хочу сгруппированную коллекцию, которая выглядит примерно так
sub1 -> item1, item2, item3 sub2 -> item1, item3 sub3 -> item2, item3
Как мне это сделать?
Большое спасибо!
Я предполагаю, что item1, item2, item3 являются частью нового List<Item> с именем items
List<Item>
items
//List<Item> items = new List<Item>(); //items.Add(item1); //items.Add(item2); //items.Add(item3); var groupedBySub = from item in items from s in item.Subs group item by s into g select new{ Sug = g.Key, Items = g };
Это один из способов:
var items = new[] {item1, item2, item3}; var result = from s in items.SelectMany((i, index) => i.Subs) group s by s.Name into g select new { Sub = g.Key, Items = items .Where(i => i.Subs.Any(s => s.Name == g.Key)) .Select(i => i) .ToList() };
Что-то вроде этого я v4.0?
new[]{ item1, item2 ,item3 } .SelectMany(i => i.Subs,(i,s)=>new { Sub=s,Item=i }) .ToLookup(l=>l.Sub,l=>l.Item)
Я не знаю, будет ли это работать в 3,5, хотя