2017-08-13 15 views
1

を返す私は(EMPIDに基づいて、すべての評価の合計)のような最終的な結果を望んで三List<Results>LINQグループと結果に

var list1 = new List<Results> { 
    new Results{ Empid = 1,Empname = "John",Rating = 1.33}, 
    new Results{ Empid = 2,Empname = "Aarya",Rating = 1.6}, 
    new Results{ Empid = 3,Empname = "Sansa",Rating = 1.6} 
}; 

var list2 = new List<Results> { 
    new Results{ Empid = 1,Empname = "John",Rating = 2.33}, 
    new Results{ Empid = 2,Empname = "Aarya",Rating = 2.6}, 
    new Results{ Empid = 3,Empname = "Sansa",Rating = 1.6} 
}; 

var list3 = new List<Results> { 
    new Results{ Empid = 1,Empname = "John",Rating = 0.33}, 
    new Results{ Empid = 2,Empname = "Aarya",Rating = 0.6} 
}; 

を持って

Final={Empid=1,Empname="John",Rating=3.99} 
    {Empid=2,Empname="Aarya",Rating=4.8} 
    {Empid=3,Empname="Sansa",Rating=3.2} 

のLINQを使用することによって、これを達成する方法私はLinQには初めてです。私はGroupByを使って試していますが、できませんでした。

var result = list1.Concat(list2).Concat(list3) 
        .GroupBy(item => new { item.Empid, item.Empname }, item => item.Rating) 
        .Select(g => new { 
         Id = g.Key.Empid, 
         Name = g.Key.Empname, 
         Rating = g.Sum() }); 

またはクエリ構文で:によってリストや、通常のグループをマージする

+0

サンプルデータを有効なC#コードとして提供してください。 – Enigmativity

+0

@Enigmativityに感謝します。 – kiransr

+1

プロのヒント:あなたが「私はこれを試しましたが、できませんでした」と書いているときはいつでも、書き留めてはいけません。 – halfer

答えて

7

使用ConcatEmpidに基づいて、すべての評価の

var result = from item in list1.Concat(list2).Concat(list3) 
      group item.Rating by new { item.Empid, item.Empname } into g 
      select new { 
       Id = g.Key.Empid, 
       Name = g.Key.Empname, 
       Rating = g.Sum() 
      }; 

合計 - もしことに注意してくださいidとnameが相関する場合は、上記の例のように2つのグループにグループ化するのが最も簡単です。その後、

var q = from p in concatlist 
     group p by new { p.Empid, p.Empname} into g 
     select new 
     { 
      Empid = g.Key.Empid, 
      Empname = g.Key.Empname, 
      Rating = g.Sum(c=>c.Rating) 
     }; 
0

を取得あなたがリストの動的な量を照会することができるようになります他の回答

SelectMany
var final = 
    new[] { list1, list2, list3 }.SelectMany(list => list) 
           .GroupBy(result => new { result.EmpId, result.EmpName }) 
           .Select(group => new Results 
           { 
            EmpId = group.Key.EmpId, 
            EmpName = group.Key.EmpName, 
            Rating = group.Sum(result => result.Rating) 
           }); 

と同じグループ化を使用

0

それとも、リストの「フラット化」するEnumerable.SelectManyメソッドを使用することができますし、:それ以外の場合は、IDによるグループと最初にあなたが一緒にすべてのリストをCONCATなければならないし、このような何かを書く、グループごとに.First().Empname

関連する問題