Используя поле объекта как универсальный ключ Словаря

Попробуйте настроить брандмауэр хранилища с Исходящими IP-адресами приложения функций , чтобы сделать вывод:

  1. На панели функций в портале Azure, Функции платформы> Обозреватель ресурсов. [119 ]

  2. Найдите outboundIpAddresses и добавьте все из них в список IP-адресов брандмауэра.

  3. Если наши функции выполняются в специальном плане обслуживания приложений (например, «Базовый», «Стандартный» и т. Д.), Добавьте possibleOutboundIPAddresses, если мы хотим масштабировать план для других уровней ценообразования.

  4. Если наши функции находятся в плане потребления, нам, возможно, придется внести в белый список центр обработки данных приложений функций.

115
задан gman 3 April 2018 в 03:22
поделиться

3 ответа

По умолчанию два важных метода GetHashCode() и Equals(). Важно что, если две вещи равны (Equals() возвращает true), что у них есть тот же хэш-код. Например, Вы могли бы "возвратить FooID"; как GetHashCode(), если Вы хотите это как соответствие. Можно также реализовать IEquatable<Foo>, но это является дополнительным:

class Foo : IEquatable<Foo> {
    public string Name { get; set;}
    public int FooID {get; set;}

    public override int GetHashCode() {
        return FooID;
    }
    public override bool Equals(object obj) {
        return Equals(obj as Foo);
    }
    public bool Equals(Foo obj) {
        return obj != null && obj.FooID == this.FooID;
    }
}

Наконец, другая альтернатива должна обеспечить IEqualityComparer<T>, чтобы сделать то же.

145
ответ дан Marc Gravell 24 November 2019 в 02:26
поделиться

Поскольку Вы хотите FooID быть идентификатором для группы, необходимо использовать это в качестве ключа в словаре вместо объекта Foo:

Dictionary<int, List<Stuff>>

, Если бы Вы использовали бы эти Foo объект как ключ, Вы просто реализовали бы GetHashCode и Equals метод, чтобы только рассмотреть FooID свойство. Name свойство просто было бы собственным весом насколько эти Dictionary был затронут, таким образом, Вы будете просто использовать Foo в качестве обертки для int.

Поэтому лучше использовать эти FooID значение непосредственно, и затем Вы ничего уже не должны реализовывать как Dictionary поддержки с помощью int как ключ.

Редактирование:
, Если Вы хотите использовать Foo класс, поскольку ключ так или иначе, эти IEqualityComparer<Foo> легко реализовать:

public class FooEqualityComparer : IEqualityComparer<Foo> {
   public int GetHashCode(Foo foo) { return foo.FooID.GetHashCode(); }
   public bool Equals(Foo foo1, Foo foo2) { return foo1.FooID == foo2.FooID; }
}

Использование:

Dictionary<Foo, List<Stuff>> dict = new Dictionary<Foo, List<Stuff>>(new FooEqualityComparer());
31
ответ дан Guffa 24 November 2019 в 02:26
поделиться

Для Foo необходимо будет переопределить объект. GetHashCode () и объект. Равняется ()

, словарь назовет GetHashCode () для вычисления блока хеша для каждого значения и Равняется, чтобы выдержать сравнение, идентичны ли два Foo.

Удостоверяются, что вычислили, хорошие хэш-коды (избегайте многих равных объектов Foo, имеющих тот же хэш-код), но удостоверьтесь два, равняется Foos, имеют тот же хэш-код. Вы могли бы хотеть запуститься с Равняться-метода и затем (в GetHashCode ()) xor хэш-код каждого участника, в котором Вы выдерживаете сравнение, Равняется.

public class Foo { 
     public string A;
     public string B;

     override bool Equals(object other) {
          var otherFoo = other as Foo;
          if (otherFoo == null)
             return false;
          return A==otherFoo.A && B ==otherFoo.B;
     }

     override int GetHashCode() {
          return 17 * A.GetHashCode() + B.GetHashCode();
     }
}
8
ответ дан jball 24 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: