7

次のような2つのGUIDリストがあります。

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

ユーザー ID と lsCheckedUsers リストは、dapper を使用して SQL データベースから取り込まれます。

lsCheckedUsers にないすべてのユーザー ID を検索したいと考えています。

私は次のことを試しました

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

上記の実際のいずれも、2 の差を返しません。

両方に存在しない GUID の違いを取得するにはどうすればよいですか。

lsCheckedUsers には、ユーザー ID にある Guid があると確信しています

4

4 に答える 4

13

正解です:

var userdifference = userids.Except(lsCheckedUsers);

両方にIEnumerable<dynamic>実際に含まれている場合に機能しますGuids。それぞれの項目を印刷するか調べて、それらがGuids.

これが期待どおりの場合は、実際にIEnumerable<Guid>受信アイテムを使用してキャストする必要があります。Guidsうまくいけば、潜在的に見ているようなエラーを防ぐことができます。

于 2013-03-27T18:51:06.343 に答える
2

それらの線に沿った何か..

var difference = list1.Where (e => !list2.Any(a => a == e))
于 2013-03-27T18:27:38.447 に答える
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 であることがわかります。

于 2013-03-27T18:22:18.737 に答える
1

Enumerable には Except メソッドがあります

Enumerable.Except メソッド (IEnumerable、IEnumerable)

また、文字列または GUID を使用します。
等しい値を比較します。

HashSet ExceptWith の方がおそらくパフォーマンスが向上します。
ただし、重複を許可する必要がある場合は、HashSet を使用できません。

HashSet.ExceptWith メソッド

于 2013-03-27T18:43:18.663 に答える