私は次のような人のクラスを持っています:
Public Class Person
{
public int Id {get; set;}
public int FirstName {get; set;}
public int LastName {get; set;}
}
Person オブジェクトのリストを作成します。
List<Person> AllPersons = GetAllPersons();
GetAllPersons() には、ID に基づいて一意で繰り返しのない人物オブジェクトを提供するこのコードがあります。
return this.colLoadExternalData.GroupBy(p => p, new MyClass()).Where(g => g.Count() == 1).Select(g => g.Single()).ToList();
つまり、ソースに Id = 123 の人物が 2 人いた場合、123 はリストに表示されません。
IEqualityComparer を実装するクラスは次のとおりです。
public class MyClass : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Id == y.Id;
}
public int GetHashCode(Person obj)
{
return obj.Id.GetHashCode();
}
}
MyClass セットは、ID に基づく ID です。
そのプロパティ値に基づいて一意の人物を識別する FirstName や LastName などの人物クラスの ID プロパティを設定する規定がある外部構成ファイルがあります。
したがって、構成ファイルにキーとして「FirstName」と記載されている場合、MyClass は次のようになります。
public class MyClass : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.FirstName == y.FirstName;
}
public int GetHashCode(Person obj)
{
return obj.FirstName.GetHashCode();
}
}
人物オブジェクトを追加する前に実際に辞書を使用していましたが、ソースに ID 123 の 2 人の人物のような繰り返しエントリがある場合は、1 つの人物オブジェクトが追加されます。外部ソースからの繰り返しレコードを含めないでください。
私ができることは、重複のリストを別のリストに維持することです。そのリストで単純な foreach を実行し、次のように辞書から人物オブジェクトを削除します。
foreach(var dup in Duplicates)
{
UniquePersonObjects.Remove(dup);
}
ここでは IEqualityComparer は使用されていません。外部ソースから辞書にレコードを追加し、重複リストに基づいてその辞書をさらにフィルター処理するだけです。
これを行うより良い方法はありますか?
よろしく。