オブジェクトが別のオブジェクトよりも古いかどうかを基本的に検出するオブジェクトに IEqualityComparer を実装しようとしています。次のより単純な例は、私が達成しようとしていることを合成します:
class Program
{
static void Main(string[] args)
{
var authorsList = new List<Author>()
{
new Author{ Firstname = "Bob", Lastname = "Smith", Age=11 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=20 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=14 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Fred", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Trevor", Lastname = "Smith", Age=15 },
new Author{ Firstname = "Brian", Lastname = "Smith", Age=11 },
new Author{ Firstname = "Billy", Lastname = "Smith", Age=11 },
};
var authorsListExcept = new List<Author>()
{
new Author{ Firstname = "Bob", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Fred", Lastname = "Smith", Age=12 },
};
var authorsList2 = authorsList
.Except(authorsListExcept, new AuthorUpdatedComparer()).ToList();
}
}
class Author
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public int Age { get; set; }
}
class AuthorUpdatedComparer : IEqualityComparer<Author>
{
public bool Equals(Author x, Author y)
{
return x.Age >= y.Age;
}
public int GetHashCode(Author obj)
{
//Check whether the object is null
if (Object.ReferenceEquals(obj, null)) return 0;
int FirstnameHash = (obj.Firstname ?? "").GetHashCode();
int LastnameHash = (obj.Lastname ?? "").GetHashCode();
int finalResult = FirstnameHash ^ LastnameHash;
return finalResult;
}
}
* Bob Smith の年齢は 20 * Bom Smith の年齢は 14 * Trevor Smith の年齢は 15 * Brian Smith の年齢は 11 * Billy Smith の年齢は 11
しかし、代わりに 14 歳のボブ・スミスは含まれていません。デバッグ中に、20 歳の Bob Smith を含めた後の Comparer には、20 歳未満の Bob をすべて除外した比較演算子があるという結論に達しました。
これは私の見解では奇妙な動作であり、authorsListExcept に含まれているものよりも若い、または同じ年齢のもののみを除外する必要があります。私はmsdnのドキュメントを読み込もうとしましたが、それが起こるはずです:フォント: http://msdn.microsoft.com/en-us/library/bb336390(v=vs.100).aspx
誰でも私を助けることができますか?ありがとう、ヒューゴ・サルガド