2017-06-14 8 views
0

私は、グループを形成し、いくつかの共通のクラスで複製データを再整列/フォーマットした後に複製を探したいというシナリオを持っています。C#Linq複数のプロパティでグループを作成し、結果のグループを単一のキー/プロパティにフォーマットするには?

例 -

var lst = new List<Test> 
{ 
    new Test{Category="A",Class="Class1",Id="101",Name="John"}, 
    new Test{Category="B",Class="Class2",Id="102",Name="Peter"}, 
    new Test{Category="A",Class="Class2",Id="103",Name="David"}, 
    new Test{Category="C",Class="Class3",Id="104",Name="Julia"}, 
    new Test{Category="D",Class="Class4",Id="105",Name="Ken"}, 
    new Test{Category="A",Class="Class1",Id="106",Name="Robert"}, 
}; 

私は、グループ作成している - だから、

GroupItem1 - Category = "A" , Class = "Class1", Id = {101,106} 
GroupItem2 - Category = "A" , Class = "Class2", Id = {103} 

- 私は別のクラスとカテゴリーのための2グループ項目を結果

var group = 
    from c in lst 
    group c by new 
    { 
     c.Category, 
     c.Class 
    } into g 
    select new 
    { 
     Category = g.Key.Category, 
     Class = g.Key.Class, 
     Id = lst.Where(x => g.Key.Category == x.Category && g.Key.Class==x.Class) 
       .Select(y => y.Id).ToList() 
    }; 

を私は以下のような場合に結果を表示するという要件を持っていますその他のカテゴリ -

Category = "A", Class = "Class1 OR SomeCommonClass", Id = {101,106,103} 

最小限のコードと最適化されたロジックでこの結果を達成できますか?

+0

優秀な質問:JoinIEnumerable拡張メソッドである

var groups = from c in lst group c by c.Category into g select new { Category = g.Key, Class = g.Select(c => c.Class).Distinct().Join(" or "), IDs = g.Select(c => c.Id).ToList() }; 

。 – NetMage

答えて

1

カテゴリ別にグループ化して結果を得る場合は、クエリを使用します。

  var group = 
       from c in lst 
       group c by new 
       { 
        c.Category 

       } into g 
       select new 
       { 
        Category = g.Key.Category, 
        Class = lst.Where(x => g.Key.Category == x.Category).Select(y => y.Class).ToList(), 
        Id = lst.Where(x => g.Key.Category == x.Category) 
          .Select(y => y.Id).ToList() 
       }; 
1

はこれであなたのgroupクエリを置き換えます。データと明確な例で

public static string Join(this IEnumerable<string> strings, string sep) => String.Join(sep, strings.ToArray()); 
1
  var group = lst.GroupBy(l => l.Category) 
       .Select(x => new 
       { 
        Category = x.Key, 
        Class = string.Join(" OR ", x.Select(c => c.Class).Distinct()), 
        Ids = x.Select(c => c.Id).ToList() 
       }).ToList(); 
+0

今後の読者の理解を助けるためにコードを少し説明してください。 – WhatsThePoint

関連する問題