2013-03-27 40 views
5

之間的區別我的GUID 2名單爲:如何找到2個IEnumerable的對象

IEnumerable<dynamic> userids = null; 
IEnumerable<dynamic> lsCheckedUsers = null; 

的用戶ID和lsCheckedUsers列表是從SQL數據庫採用短小精悍的填充。

我現在想查找所有不在lsCheckedUsers中的userid。

我曾嘗試以下

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers)); 
var userdifference = userids.Except(lsCheckedUsers); 

以上都不是實際收益的2

如何獲得不中都存在的GUID的差異之間的差異。

我確信,lsCheckedUsers具有在用戶ID的GUID

+2

'!lsCheckedUsers.Contains(lsCheckedUsers)'是一個非常有趣的聲明 - 將會是常量('false'我認爲)... – 2013-03-27 18:21:28

+5

是否有一個原因,您使用IEnumerable 而不是' IEnumerable '? – itsme86 2013-03-27 18:24:36

回答

9

這是正確的:

var userdifference = userids.Except(lsCheckedUsers);

如果同時你IEnumerable<dynamic>實際上包含Guids它將工作。打印或檢查每個項目,以確保它們是Guids

如果這是您所期望的,您應該確實使用IEnumerable<Guid>並將傳入的項目轉換爲Guids。它會希望能夠防止你可能看到的錯誤。

+0

當使用動態對象時,比較不能按照應有的方式工作。我改變了實際的Guid類型,並工作 – user1526912 2013-03-28 17:34:18

+0

@ user1526912:嗯,有趣。如果內部類型實際上是「Guids」,它肯定應該用'動態'。我用'IEnumerable '和'IEnumerable '測試了它(簡單測試 - 幾個'List '帶有一些匹配和不匹配的'Guids')。我想知道你是否將他們選爲'Guids'做了某種內部轉換...... – 2013-03-28 22:00:17

1

您有:

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(lsCheckedUsers)); 

但我認爲你的意思是:

var userdifference = userids.Where(i => !lsCheckedUsers.Contains(i)); 

更新:

給大家打分這些答案因爲「參考」比較,認爲Guid是一種值類型,因此其平等的評估方式不同。試試這個簡單的測試來說服你自己:

var guid = Guid.NewGuid(); 
var guids = new[] { new Guid(guid.ToString()) }; 

Console.WriteLine(guids.Contains(guid)); 

你會看到結果是True。

+0

只有當它們是相同的參考時它纔會起作用。這兩個列表都從數據庫填充。 – 2013-03-27 18:32:55

+0

@VitorCanova這通常是真的,但Guid是一個結構,它的相等性以不同的方式進行評估。嘗試一下,看看。 – itsme86 2013-03-27 18:45:27

+0

對不起。沒有注意到這一點。你爲什麼使用動態? – 2013-03-27 19:29:35

2

東西沿着這些線路..

var difference = list1.Where (e => !list2.Any(a => a == e)) 
+0

好的ans ....經典的方法.. !!!! :P – 2014-07-07 09:37:19

相關問題