Могу ли я получить сохраненное значение x в хэш-наборе, учитывая объект y, где x.Equals (y) - PullRequest
3 голосов
/ 29 марта 2012
[TestFixture]
class HashSetExample
{
    [Test]
    public void eg()
    {
        var comparer = new OddEvenBag();
        var hs = new HashSet<int>(comparer);

        hs.Add(1);

        Assert.IsTrue(hs.Contains(3));
        Assert.IsFalse(hs.Contains(0));

        // THIS LINE HERE
        var containedValue = hs.First(x => comparer.Equals(x, 3)); // i want something faster than this
        Assert.AreEqual(1, containedValue);
    }

    public class OddEvenBag : IEqualityComparer<int>
    {
        public bool Equals(int x, int y)
        {
            return x % 2 == y % 2;
        }

        public int GetHashCode(int obj)
        {
            return obj % 2;
        }
    }
}

Помимо проверки, содержит ли hs нечетное число, я хочу знать, что такое нечетное число, если оно содержится.Очевидно, мне нужен метод, который масштабируется разумно, а не просто перебирает и выполняет поиск по всей коллекции.

Еще один способ перефразировать вопрос заключается в том, что я хочу заменить строку ниже ЭТА СТРОКА с чем-то эффективным (скажем, O (1) вместо O (n)).

К какому концу?Я пытаюсь интернировать laaaaaaaarge количество неизменяемых эталонных объектов, похожих по размеру на Point3D.Похоже, использование HashSet<Foo> вместо Dictionary<Foo,Foo> экономит около 10% памяти.Нет, очевидно, это не изменит правила игры, но я подумал, что не помешает попробовать это для быстрой победы.Извиняюсь, если это кого-то обидело.

Редактировать: Ссылка на аналогичный / идентичный пост , предоставленный Балазом Тиханым в комментариях, выложить здесь для акцента.

1 Ответ

1 голос
/ 17 апреля 2015

Простой ответ - нет, вы не можете.

Если вы хотите получить объект, вам нужно будет использовать HashSet. В API просто нет подходящего способа сделать то, о чем вы просите.

Одна оптимизация, которую вы могли бы выполнить, хотя, если вы должны использовать Set, для этого сначала нужно выполнить проверку contains, а затем выполнять итерацию по Set, только если аргумент содержит возвращает true. Тем не менее, вы почти наверняка обнаружите, что дополнительные издержки для HashMap крошечные (поскольку по сути это просто еще одна ссылка на объект).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...