[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% памяти.Нет, очевидно, это не изменит правила игры, но я подумал, что не помешает попробовать это для быстрой победы.Извиняюсь, если это кого-то обидело.
Редактировать: Ссылка на аналогичный / идентичный пост , предоставленный Балазом Тиханым в комментариях, выложить здесь для акцента.