2

C#: オブジェクトのコレクションがあります。T には 2 つのプロパティがあります。プロパティ A とプロパティ B。このコレクションが準拠する必要がある規則は、A と B の値の組み合わせがコレクション内で一意でなければならないということです。つまり、A と B は複合主キーとして機能する必要があります。

この状態を確認するために使用できる Linq の操作はありますか? 私はそれが次のようなものになると予想します

if (items.Select(x => x.Name).Distinct().Count() != items.Select(x => x.Name).Count())

上記のステートメントは、コレクション内に重複する名前を持つアイテムがあるかどうかを確認する方法ですが、複数のプロパティに対してそれを行う方法がわかりません。

4

3 に答える 3

12

匿名型を使用して複合キーを選択します。

int totalCount = items.Count();
int distinctCount = items.Select(x => new { x.Name, x.Other })
                         .Distinct()
                         .Count();

匿名型は、プロパティ (およびそれらのプロパティの型の既定の等値比較子) に基づいて等値とハッシュコードを自動的に実装します。

于 2009-10-27T11:49:31.477 に答える
0

独自の等値比較子を挿入できます。例はこちら: http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/c5b71644-b2d9-422b-b7fe-ef3bef30bbac/

于 2009-10-27T11:48:52.320 に答える
0

新しい匿名オブジェクトを選択するだけです

var keys = items.Select( x => new { x.Name, x.Other } ).ToList();

if (keys.Distinct().Count() != keys.Count())
{
 ...
}
于 2009-10-27T11:51:41.660 に答える