當我的集合中有重複項時,我想返回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,如果沒有任何重複,它沒有返回值(應該是假的)。
當我的集合中有重複項時,我想返回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,如果沒有任何重複,它沒有返回值(應該是假的)。
問題是,當有多個副本時,它將返回多個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。
var t = (from i in selectedDrivers
group i by i.Value into g
where g.Count() > 1
select g.Count() > 1).Any();
我相信這會做到這一點。
關閉,但沒有雪茄;-)當我沒有重複,它仍然會返回true。我希望它是假的。 –
有趣 - .Any()只有在有記錄時才返回true。哦 - 我想知道......刪除最後一個> 1 - 我剛剛意識到它將最後一位評估爲布爾值,所以即使返回0個記錄,0> 1 = false和false也是如此,Any = true。 –
不是最optomised解決方案,但是....
var t = selectedDrivers.Distinct().Count() != selectedDrivers.Count();
感謝您的回答! –
總結你的結果在一個或。
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);
+1使用聚合與布爾! –
謝謝。這是非常不足的,但。 –
謝謝你的回答! –
這是它。
var t = selectedDrivers
.GroupBy(item => item.Value)
.Any(group => group.Skip(1).Any());
我已經使用「group.Skip(1)。任何()」來找到一組的至少兩種元素並且避免與計數枚舉整個組()。
這個工程!感謝您的回答。 –
這不如Eric的解決方案,因爲它會分組整個枚舉,但這似乎是在這裏使用Any
的正確方法。
var t = selectedDrivers
.GroupBy(item => item.Value)
.Any(group => group.Count() > 1)
這是我忘記添加的東西 - 當它發現重複時,應該足夠並返回。感謝您的回答! –
也許有一個問題?我看你已經使用了HashSet。開始閱讀有關它,並想知道爲什麼你使用它? –
@Garth:HashSets具有很好的屬性,它可以非常快地插入一個新項目,並且非常快速地檢查項目是否存在。在這種情況下,我將該集合用作「我已經看過的所有東西」的記錄,而且我需要快速執行的兩個操作恰恰就是這些操作:插入一個新項目,或告訴我一個項目是否已經存在。 –