0

「誰もが」 MoreLinq からの便利な DistintBy 拡張機能を知っています。これを使用して、リスト os オブジェクトを複数のプロパティで区別する必要があります (問題ありません)。このプロパティの 1 つがリストの場合、ここに私のカスタム クラスがあります。

public class WrappedNotification
{
    public int ResponsibleAreaSourceId { get; set; }
    public int ResponsibleAreaDestinationId { get; set; }
    public List<String> EmailAddresses { get; set; }
    public string GroupName { get; set; }
}

テスト ファイルで、いくつかのオブジェクトを作成し、このアイテムを区別しようとします

List<WrappedNotification> notifications = new List<WrappedNotification>();
notifications.Add(new WrappedNotification(1, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));

最初の項目だけが異なることに注意してください。次のコードを使用すると、これらの項目を DistinctBy することができ、結果リストには 2 つの項目が含まれ、問題ありません。

 notifications = notifications.DistinctBy(m => new
 {
     m.ResponsibleAreaSourceId,
     m.ResponsibleAreaDestinationId,
     //m.EmailAddresses,
     m.EvalStatus
 }).ToList();

行 (//m.EmailAddresses) にコメントすると、機能せず、5 つのアイテムが返されます。どうすればこれを区別できますか?

4

1 に答える 1

0

DistinctBy指定したすべての「キー」に対してデフォルトの等値比較子を使用します。デフォルトの等値比較子List<T>は、リスト自体の参照を比較するだけです。2 つのリストの内容が同じかどうかはチェックしません。

あなたの場合DistinctBy、間違った選択です。メールアドレスで使用Enumerable.DistinctするカスタムIEqualityComparerを使用して提供する必要があります。SequenceEquals

于 2013-02-18T13:53:09.327 に答える