1

私がここで何をしているのかを説明するために最善を尽くします - 私はこのアプローチを数回使用しましたが、それほど良いと感じたことはありません. もっと良い方法があるに違いないと確信しています。教えてください。

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 のオーバーライドを使用して、重複したエントリを蓄積したいと考えています。(または、これよりもはるかに複雑な場合でも、複合キー オブジェクトを使用する必要がありますか?)。上記の方法は面倒に思えますが、おそらくそれが最善の方法でしょうか?

私よりも賢い人が、これを改善できる場所を教えてもらえますか?

ありがとう。

4

1 に答える 1

3

基本的に、GetHashCode と Equals のオーバーライドを使用して、重複したエントリを蓄積したいと考えています。

できません。それは彼らがそこにいる目的ではありません。それらは、キーを見つけるためにのみ存在し、キーが等しいかどうかをテストします。あなたは確かにそこに何かを変異させるべきではありません.

使用するアプローチはTryGetValue機能しますが、値が変更可能である必要があり、これは快適な IMO ではありません。ただし、見たいと思うかもしれませんが、これには、まさにあなたが望むことを行うように聞こえるConcurrentDictionary<,>便利なメソッドがあります。AddOrUpdate

于 2012-11-29T15:05:05.727 に答える