2012-11-29 33 views
1

我會盡我所能來解釋我在這裏做什麼 - 我已經使用這個方法了幾次,但從來沒有覺得倒是不錯。我相信一定有這樣做的更好的辦法,請賜教。IDictionary的複製合併 - 新增或更新現有的對象

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和等於重寫的重複條目。 (或者我應該使用組合鍵對象 - 甚至是更復雜的情況比這個?)。上面的方法似乎很麻煩,但也許這是最好的方法?

可有人比我更聰明,請告訴我,我可以在這個改進?

謝謝。

+0

您是否在尋找'test.Distinct()'簡單?這返回2個項目。 –

回答

3

基本上我想積累使用GetHashCode和等於重寫的重複條目。

你不行。那不是他們在那裏。他們是目前找到的關鍵,測試它是否相等。你當然不應該改變那裏的任何東西。

用你的方法 TryGetValue的作品,但它要求你的價值觀是可變的,這是不愉快的IMO

。你可能想看看ConcurrentDictionary<,>,雖然,這有一個方便的AddOrUpdate方法,這聽起來像它正是你想要的。

相關問題