IDictionary重复合并 - 添加或更新现有对象

时间:2012-11-29 15:03:30

标签: c# .net dictionary hashcode

我会尽力解释我在这里做的事情 - 我已经使用过这种方法几次,但从来没有感觉到这么好。我相信一定有更好的方法,请赐教。

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重写来累积重复的条目。 (或者我应该使用复合键对象 - 即使是比这更复杂的情况?)。上面的方法似乎很乱,但也许这是最好的方法?

有人比我更聪明,请告诉我可以改进的地方吗?

感谢。

1 个答案:

答案 0 :(得分:3)

  

基本上我想使用GetHashCode和Equals重写累积重复的条目。

你做不到。这不是他们的目的。他们单独出现以找到密钥,测试它是否相等。你当然不应该在那里改变任何东西。

使用TryGetValue的方法有效,但它要求您的值是可变的,这不是令人愉快的IMO。您可能希望查看ConcurrentDictionary<,>,它有一个方便的AddOrUpdate方法,听起来就像它完全符合您的要求。