- LINQ

2016-10-22 2 views
0

I持つ二つの配列..私はProductによってグループdata1にしたいだけのためにSalesによってグループの合計を行う- LINQ

var data1 = new[] { 
     new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
     new { Product = "Product 2", Year = 2009, Sales = 522 }, 
     new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
     new { Product = "Product 2", Year = 2011, Sales = 711 }, 
     new { Product = "Product 2", Year = 2012, Sales = 2245 }, 
     new { Product = "Product 3", Year = 2012, Sales = 1000 } 
    }; 

var data2 = new[] { 
     new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
     new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
     new { Product = "Product 2", Year = 2011, Sales = 711 }, 
     new { Product = "Product 2", Year = 2012, Sales = 2245 } 
    }; 

data2に存在する製品と同様の方法で注文してください。data2です。 data2に商品が入っていても、その製品のdata1にあるすべての年がdata2(例:{ Product = "Product 2", Year = 2009, Sales = 522 })に存在しないため、グループ化と合計はdata1で発生する必要があります。

だけでグループ化を行うと、動作するはずです以下の合計..

data1.GroupBy(x=>x.Product) 
.Select(x=>new {Product=x.Key,Total= x.Sum(s=>s.Sales)}) 

しかし、どのように私はDATA2でのみ製品を選択確保とDATA2のようProductで結果を注文するん

答えて

1

: あなたはこのように非常に簡単なものと一緒に取得することがあります。

最終結果に2番目のリストの製品が同じ順序で含まれるようにするため、2番目のリストからDistinct製品を取得することから始めます。ドキュメントに明示的に述べられていないが

、(GroupByに類似)Distinct方法は、ソース内の固有の要素の最初の発生のために別個の要素を得、それ故にDistinctの結果は、生成物であろう最終的な結果は正しい順序で返されます。

それから私は非常に効率的なクエリで終わる、最初のリストでそれを相関させるGroupJoinを使用します。

var result = data2.Select(item => item.Product).Distinct() 
    .GroupJoin(data1, product => product, item => item.Product, (product, group) => 
     new { Product = product, Sales = group.Sum(item => item.Sales) }) 
    .ToList(); 
1

あなたが必要に2つのこと:まず、data2から利用可能な製品を選択します。このために、Selectのオーバーロードを使用できます。一致する要素のインデックスも表示されます。

第2に、をdata2の製品に基づいてフィルタリングし、後でグループ化を実行します。最後のステップとして、製品のインデックスと一致する新しいプロパティCorrespondingIndexdata2に追加します。このインデックスは、製品の注文に基づいてのリストをdata2に注文するために使用できます。

var productsWithIndex = data2 
    .Select(x => x.Product) 
    .Distinct() 
    .Select((p, idx) => new {Product = p, Index = idx}); 

    var filteredProducts = data1 
    .Where(x => productsWithIndex.Select(p => p.Product).Contains(x.Product)) 
    .GroupBy(x => x.Product) 
    .Select(x => new 
    { 
     Product = x.Key, 
     Total = x.Sum(s => s.Sales), 
     CorrespondingIndex = productsWithIndex.Single(p => p.Product == x.Key).Index 
    }) 
    .OrderBy(x => x.CorrespondingIndex); 
0

あなたは、そのような詳細に行く必要はありませんが、user1384848が行っています。私は別のアプローチを取るだろう

var result = 
       data1.Where(e => data2.Any(x => x.Product == e.Product)) 
        .GroupBy(arg => arg.Product, 
         (name, products) => new {Product = name, Total = products.Sum(e => e.Sales)}) 
        .OrderBy(d => d.Product); 
+0

このDATA1の製品注文でそれを注文しません – Arnab