2012-05-10 3 views
1

配列内の大半の要素を見つけるには、LinqをC#で使用する方法はありますか?もう少し複雑にするために、大多数がない場合は、最初の要素を取る必要があります。LINQを使用しているstring []の多数決?

たとえば、配列["A", "B", "B"]の場合、ステートメントは"B"と評価されます。 配列["A", "B", "C"]の場合、ステートメントは"A"と評価されます。

これを行うには他に100の方法があると思いますが、Linqソリューションがあるかどうか不思議です。

答えて

5
string majority = yourArray.GroupBy(x => x) 
          .OrderByDescending(g => g.Count()) 
          .First() 
          .Key; 

オンラインで作業、それを参照してください:あなたのように定義することができ、ここでideone

+1

これは 'O(n log n)'です。あなたはより良いことができます(並べ替えを避ける)。 – jason

+0

大部分がない場合(すべてが等しい)、私は 'OrderByDescending'が元のリストから最初の項目を返すことは保証されていないと思います。 – Magnus

+2

@Magnus:どうしてそんなことを考えますか? [docs](http://msdn.microsoft.com/en-us/library/bb534855.aspx)から: "このメソッドは、安定した並べ替えを実行します。つまり、2つの要素のキーが等しい場合、要素は保存されています。 –

6
var majority = array.GroupBy(x => x) 
        .MaxBy(g => g.Count()) 
        .Key; 

を、私は(それのバージョンへのリンクをたどるが、考え方は単純です)MaxByを使用しています拡張メソッド。

+0

maxbyとは何ですか? –

+0

別の回答には、そのバージョンへのリンクがあります。リンクをたどります。 – jason

+1

複雑すぎると思われます。 –

0
var strings = new List<string>{"A", "B", "B"}; 

var mostCommonOrFirst = strings 
    .GroupBy(s => s) 
    .OrderByDescending(g => g.Count()) 
    .Select(g => g.Key) 
    .First(); 
関連する問題