2015-01-13 2 views
2

Я новичок в попытке использовать интерфейсы IEnumerable. Я всегда просто писал собственную сортировку хешей вместо того, чтобы пытаться использовать собственный синтаксис, потому что я был несколько смущен реализацией. Я пытаюсь определить, могу ли я собрать список в отсортированном формате с помощью BinarySearch или некоторой подобной функции. Есть функция, которая вернет ближайший возможный индекс для вставки нового элемента в список, чтобы список всегда сортировался через хэш-дерево каждый раз, когда вы вставляете элемент?Может ли IComparer использоваться для хеширования списка, поскольку он заполнен?

Когда я использую BinarySearch, он всегда возвращает -1, если нет совпадения. Я бы предпочел, чтобы он вернул ближайший возможный индекс. Есть ли способ сделать это с помощью родных интерфейсов IEnumerable? Я бы предпочел не называть «Сортировка (IComparer)» каждый раз, когда я хочу ссылаться на Список.

Вкратце: можно ли использовать BinarySearch или какую-либо эквивалентную функцию при добавлении нового элемента в список, чтобы найти лучший индекс для «Вставить (Item, index)» в список?

ответ

4

Рассмотрите возможность использования SortedSet<T>, который имеет встроенную поддержку для сортировки списка. Это имеет преимущество, гарантируя, что содержимое всегда будет в порядке сортировки, а не полагаться на ваш код, чтобы должным образом уважать порядок сортировки всякий раз, когда список изменяется.

+0

Спасибо, я знал только о «SortedList», которого я не хотел. Я знал, что там должен быть класс, который сделал это. – ThisHandleNotInUse

+0

Хммм ... MSDN говорит, что «SortedSet» использует линейный шаблон поиска ... разве это не побеждает цель использования IComparer? Или есть причина, по которой она должна быть линейной, которая уклоняется от моих рассуждений относительно интерфейса IComparer? Прямо сейчас, все классы «IComparer», как классы, чувствуют себя «черным ящиком» для меня - я думаю, вы знаете, что я имею в виду ... – ThisHandleNotInUse

+0

IComparer просто возвращает единственный результат сравнения для пары значений; он не предоставляет никакой другой информации, такой как хеширование. Хеширование обеспечивается методом [Object.GetHashCode] (http://msdn.microsoft.com/en-us/library/system.object.gethashcode%28v=vs.110%29.aspx), по крайней мере, когда выведение класс реализует его. Вот как такие классы, как «Словарь» генерируют свои хэши –

0

В случае, если кто-либо сталкивается с этим - первое решение - , всегда внимательно прочитайте документацию, прежде чем задавать вопросы.

BinarySearch (IComparer) возвращает побитовое комплимент следующего лучшее положение, если совпадение не найдено, поэтому она удовлетворяет потребность «бинарное дерево рода» Перечень при заполнении его. Когда я увидел, что он возвращает «-1», я ошибочно пришел к выводу, что это означает «не найден» из-за того, что я часто использую «-1» для «не найден», когда целое число должно быть положительным.

Смежные вопросы