私がここで何をしているのかを説明するために最善を尽くします - 私はこのアプローチを数回使用しましたが、それほど良いと感じたことはありません. もっと良い方法があるに違いないと確信しています。教えてください。
class MyObject
{
public int Id { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
if (obj.GetType() != typeof(MyObject))
{
return false;
}
return ((MyObject)obj).Id == Id;
}
public override int GetHashCode()
{
return Id;
}
}
[Test]
public void Blah()
{
IDictionary<object, MyObject> duplicateMergerDict = new Dictionary<object, MyObject>();
MyObject dup1 = new MyObject { Id = 0, Name = "Smith" };
MyObject dup2 = new MyObject { Id = 0, Name = "Collins" };
MyObject nonDup = new MyObject { Id = 1, Name = "Smith" };
IEnumerable<MyObject> test =
new[] { dup1, dup2, nonDup };
foreach (var myObject in test)
{
MyObject existing;
if (duplicateMergerDict.TryGetValue(myObject, out existing))
{
existing.Name = string.Format("{0} {1}", existing.Name, myObject.Name);
}
else
{
duplicateMergerDict.Add(myObject, myObject);
}
}
Assert.That(duplicateMergerDict.Count, Is.EqualTo(2));
Assert.That(duplicateMergerDict[dup1], Is.SameAs(dup1));
Assert.That(duplicateMergerDict[dup2], Is.SameAs(dup1));
Assert.That(dup1.Name, Is.EqualTo("Smith Collins"));
Assert.That(duplicateMergerDict[nonDup], Is.SameAs(nonDup));
}
基本的に、GetHashCode と Equals のオーバーライドを使用して、重複したエントリを蓄積したいと考えています。(または、これよりもはるかに複雑な場合でも、複合キー オブジェクトを使用する必要がありますか?)。上記の方法は面倒に思えますが、おそらくそれが最善の方法でしょうか?
私よりも賢い人が、これを改善できる場所を教えてもらえますか?
ありがとう。