1

MSDN で HashSet を読むと、 with と表示HashSet<T>されます。T が実装されているIEquatable<T>場合、HashSet はこれを に使用しIEqualityComparer<T>.Defaultます。

したがって、クラス Person を次のようにします。

public class Person : IEquality<Person>
{
    private string pName;
    public Person(string name){ pName=name; }
    public string Name
    {
        get { return pName; }
        set
        {
            if (pName.Equals(value, StringComparison.InvariantCultureIgnoreCase))
            {
              return;
            }
            pName = value;
        }
    }

    public bool Equals(Person other)
    {
        if(other==null){return false;}
        return pName.Equals(other.pName, StringComparison.InvariantCultureIgnoreCase);
    }

    public override bool Equals(object obj)
    {
        Person other = obj as Person;
        if(other==null){return false;}
        return Equals(other);
    }

    public override int GetHashCode(){return pName.GetHashCode();}

    public override string ToString(){return pName;}
}

それでは、別のクラスまたはメイン関数で定義しましょう。

HashSet<Person> set = new HashSet<Person>();
set.Add(new Person("Smith"); // return true
Person p = new Person("Smi");
set.Add(p); // return true
p.Name = "Smith"; // no error occurs

これで、HashSet に同じ名前の 2 つの Person オブジェクトができました (そのため、「Equals」が存在します)。

HashSet を使用すると、オブジェクトを複製できます。

4

1 に答える 1

11

HashSet を使用すると、オブジェクトを複製できます。

重複したオブジェクトを入れることはできません。問題は、オブジェクトが追加された後にオブジェクトを変更していることです。

辞書のキーとして使用されたり、ハッシュとして保存されているオブジェクトを変更することは常に問題があり、回避することをお勧めします。

于 2012-10-05T18:00:52.643 に答える