我会尽力解释我在这里做的事情 - 我已经使用过这种方法几次,但从来没有感觉到这么好。我相信一定有更好的方法,请赐教。
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重写来累积重复的条目。 (或者我应该使用复合键对象 - 即使是比这更复杂的情况?)。上面的方法似乎很乱,但也许这是最好的方法?
有人比我更聪明,请告诉我可以改进的地方吗?
感谢。
答案 0 :(得分:3)
基本上我想使用GetHashCode和Equals重写累积重复的条目。
你做不到。这不是他们的目的。他们单独出现以找到密钥,测试它是否相等。你当然不应该在那里改变任何东西。
使用TryGetValue
的方法有效,但它要求您的值是可变的,这不是令人愉快的IMO。您可能希望查看ConcurrentDictionary<,>
,它有一个方便的AddOrUpdate
方法,听起来就像它完全符合您的要求。