2011-06-30 2 views
1

コレクションに重複がある場合はtrueを返し、そうでない場合はfalseを返したいとします。重複があるかどうかに基づいて真または偽を返します

次のようなlinqクエリがあります。

var t = from i in selectedDrivers 
     group i by i.Value into g 
     where g.Count() > 1 
     select g.Count() > 1; 

問題は、複数の重複がある場合、それは複数のtruesを返すこと、しかしあり、そして任意の重複がない場合、それは(偽でなければなりません)何も返しません。

答えて

11

複数の重複がある場合は、複数のTrueを返します。重複がない場合は、何も返しません(falseにする必要があります)。

まあ、それは解決するのは簡単です:

bool hasDupes = t.Any(); 

複数truesがある場合は、それが本当でしょう。何もない場合、それは間違いでしょう。

しかし率直に言って、私は単にそれがむしろすべての重複のセットを構築し、そのセットを照会するよりも、最初重複を発見したときベイル私自身の拡張メソッドを書くために傾くことになります。

static bool HasDuplicates<T>(this IEnumerable<T> sequence) 
{ 
    var set = new HashSet<T>(); 
    foreach(T item in sequence) 
    { 
     if (set.Contains(item)) 
      return true; 
     set.Add(item); 
    } 
    return false; 
} 

そして今、ちょうど

bool dupes = selectedDrivers.HasDuplicates(); 

簡単peasyを言います。

+0

これは私が追加することを忘れた何かだった - 重複を見つけると、それは十分で、戻っているはずです。ご回答有難うございます! –

+0

多分1つの質問?私はあなたがHashSetを使用しているのを見ます。それについて読んだり、なぜあなたがそれを使ったのか疑問に思っていましたか? –

+4

@Garth:HashSetには、新しい項目を挿入するのが非常に速く、項目が存在するかどうかを確認するために非常に高速であるという素晴らしいプロパティがあります。この場合、私はこのセットを「私がすでに見たすべてのもの」の記録として使用しています。そして、私が速くする必要がある2つの操作は正確にそれらの操作です:新しい項目を挿入するか、項目が既にあるかどうかを教えてください。 –

1
var t = (from i in selectedDrivers 
    group i by i.Value into g 
    where g.Count() > 1 
    select g.Count() > 1).Any(); 

私はこのトリックを行います。

+0

閉じる、シガーはありません;-)重複がない場合は、それでもtrueを返します。私はそれが間違っていることを望みます。 –

+0

興味深い - .Any()は、レコードがある場合にのみtrueを返すものとします。オハイオ州 - 私は疑問に思う...最後の1を取り除く - 私はちょうどブール値として最後のビットを評価しているので、0のレコードが返されても、0> 1 = falseとfalseは結果ですので、Any = trueです。 –

0

は、最もoptomisedソリューション、しかし....

var t = selectedDrivers.Distinct().Count() != selectedDrivers.Count(); 
+0

あなたの答えをありがとう! –

1

集計またはであなたの結果。

var q=from i in selectedDrivers 
    group i by i.Value into g 
    where g.Count() > 1 
    select g.Count() > 1 

return q.Aggregate(false,(x,y)=>x|y); 
+0

ブールで集計を使用する場合+1! –

+1

ありがとうございます。しかし、それは信じられないほど不十分です。 –

+0

ありがとうございました! –

0

ここにあります。

 

var t = selectedDrivers 
    .GroupBy(item => item.Value) 
    .Any(group => group.Skip(1).Any()); 
 

Iは、少なくとも2つの要素を持つグループを検索し、カウントとグループ全体を列挙避けるために「group.Skip(1).ANY()」を使用しました()。

+0

これは機能します!ご回答有難うございます。 –

0

これはEricのソリューションほど良くはありません。列挙全体をグループ化するためですが、ここではAnyを使用する正しい方法のようです。

var t = selectedDrivers 
    .GroupBy(item => item.Value) 
    .Any(group => group.Count() > 1) 
関連する問題