2011-06-30 50 views
1

當我的集合中有重複項時,我想返回true,否則我想返回false。根據是否有重複返回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

問題是,當有多個副本時,它將返回多個trues,並且如果沒有任何重複,它將不返回任何內容(應爲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

也許有一個問題?我看你已經使用了HashSet。開始閱讀有關它,並想知道爲什麼你使用它? –

+4

@Garth:HashSets具有很好的屬性,它可以非常快地插入一個新項目,並且非常快速地檢查項目是否存在。在這種情況下,我將該集合用作「我已經看過的所有東西」的記錄,而且我需要快速執行的兩個操作恰恰就是這些操作:插入一個新項目,或告訴我一個項目是否已經存在。 –

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()); 
 

我已經使用「group.Skip(1)。任何()」來找到一組的至少兩種元素並且避免與計數枚舉整個組()。

+0

這個工程!感謝您的回答。 –

0

這不如Eric的解決方案,因爲它會分組整個枚舉,但這似乎是在這裏使用Any的正確方法。

var t = selectedDrivers 
    .GroupBy(item => item.Value) 
    .Any(group => group.Count() > 1) 
相關問題