Должен ли я использовать мой объект в качестве значения ключа словаря или объединенной строки - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующий класс

public class MyObject
{
    public int Id1 {get;set;}
    public int Id2 {get;set;}
    public int Id3 {get;set;}

    public MyObject(int id1, int id2, int id3)
    {
      this.Id1 = id1;
      this.Id2 = id2;
      this.Id3 = id3;
    }
}

Я хочу создать список объектов в словаре.Лучше ли я делать это следующим образом

Dictionary<MyObject, MyObject> dictionary = new Dictionary<MyObject,MyObject>();

MyObject object1 = new MyObject(1,2,3);
MyObject object2 = new MyObject(2,2,3);
MyObject object3 = new MyObject(2,2,3);

if(!dictionary.ContainsKey(object1))
  dictionary.Add(object1,object1);

if(!dictionary.ContainsKey(object2))
  dictionary.Add(object2,object2);

if(!dictionary.ContainsKey(object3))
  dictionary.Add(object3,object3);

Или я должен создать словарь с ключом, который является строкой и содержит соединенные строки.Например

Dictionary<string, MyObject> dictionary2 = new Dictionary<string,MyObject>();

string key = object1.Id1 + "|" + object1.Id2 + "|" + object1.Id3;

if(!dictionary2.ContainsKey(key ))
  dictionary2.Add(key ,object1);

Ответы [ 2 ]

0 голосов
/ 25 мая 2018
  1. переопределить Equals + GetHashCode в MyObject или
  2. передать пользовательский IEqualityComparer<MyObject> в конструктор словаря

Но это не имеет смысласохранить этот объект как ключ и как значение.Может быть, вы хотите использовать HashSet<MyObject> вместо.

0 голосов
/ 25 мая 2018

Кажется, что вам нужен Hashset, так как ключ и значение одинаковы, и вам не нужны дубликаты.

Вам понадобится этот класс, который сообщает, какие объекты равны.

class MyObjectEqualityComparer : IEqualityComparer<MyObject>
{
    MyObjectEqualityComparer()
    {
    }

    public static readonly MyObjectEqualityComparer Default = new MyObjectEqualityComparer();

    public bool Equals(MyObject x, MyObject y)
    {
        return x.Id1 == y.Id1 && x.Id2 == y.Id2 && x.Id3 == y.Id3;
    }

    public int GetHashCode(MyObject obj)
    {
        return obj.Id1.GetHashCode() ^ obj.Id2.GetHashCode() ^ obj.Id3.GetHashCode();
    }
}

тогда сделай хешсет

HashSet<MyObject> set = new HashSet<MyObject>(MyObjectEqualityComparer.Default);


MyObject object1 = new MyObject(1,2,3);
MyObject object2 = new MyObject(2,2,3);
MyObject object3 = new MyObject(2,2,3);


if(set.Add(object1))
{
   // item was added.
}
else
{
   // item already exist.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...