2012-03-26 5 views
3

Linqでこれを行うにはどうすればよいですか?C# - 重複キーが見つかった場合は、2つの値のうち最小値を選択してください

私はListに2つのプロパティNumberとPercentageが含まれています。

は時々リストに重複した数字があります。重複した番号が発見された場合

----------------------------- 
Number: 182 | Percentage: 15% 
Number: 182 | Percentage: 70% 
... 

、私は2つのパーセント値の最低を持っているオブジェクトを選択したいとに、これらの結果を転送したいです新しいリスト。

答えて

4

Number値によって項目次

var list = originalList 
    .GroupBy(x => x.Number) 
    .Select(x => x.OrderBy(y => y.Percentage).First()) 
    .ToList(); 

このクエリする最初のグループを試してみてください。次に、各グループをパーセンテージで注文し、最初の要素(これが最も低い)を選択します。

+0

x.OrderByDescending(X => x.Pcentcentage)は、最も大きな数字である –

+0

@ F.Aquinoありがとうございます。私は提出し、それを代わりに 'OrderBy'に変更した直後にそれを捕まえました – JaredPar

+0

それは修正される前にそれをupvoteすることはできませんでした。私はこれが最も洗練されたソリューションだと思いますが、著者がlinqを求めていました(そして私は人々がIEnumerable拡張を混同していることを知っています)。 –

4
var query = from x in list 
      group x by x.Number into x 
      select x.OrderBy(y => y.Percentage).First(); 
3

これは機能しますか?

collection.GroupBy(item => item.Number).Select(group => group.Min()) 
1
var query = (from l in lst 
     group l by l.Number into g 
     select g.Min(x => x.Percentage)).ToList(); 
1

「LINQ」によるポスターは、クエリ・理解の構文の代わりに、ドットシンタックス(それ以外の場合は、他の回答で十分)を望むという解釈に基づいてこれを変更する:

var query = 
    from i in list 
    group i by i.Number into gj 
    select gj.OrderBy(x => x.Percentage).First(); 

をしかし、これはまだ使用しています注文のための多くのドット構文。どちらの機能と同等になります:あなたが最後に.First()コールが気に入らない場合、それはどちらかがLINQ言語変換内の溶液または溶液、あなたを持っていない挑戦になるだろう

var query = 
    from i in list 
    group i by i.Number into gj 
    select 
     (from i in gj 
     orderby i.Percentage 
     select i).First(); 

IMHOのドットシンタックスがこの問題を解決するクリーンな解決策にはならないでしょう。クエリの内包表記は、多くの場合、物事を簡単にすることができますが、この場合には、私は、ドット構文を好む:

var query = 
    list.GroupBy(i => i.Number) 
     .Select(gj => gj.OrderBy(i => i.Percentage).First()); 

gj.OrderBy(...).First()部分はもっと-LINQスタイルMinBy操作を実現(Jon Skeet's postを参照)

関連する問題