Выберите элемент по индексу из .NET HashSet - PullRequest
14 голосов
/ 30 сентября 2010

В настоящее время я использую пользовательский класс, полученный из HashSet.В коде есть момент, когда я выбираю элементы при определенных условиях:

var c = clusters.Where(x => x.Label != null && x.Label.Equals(someLabel));

Он работает нормально, и я получаю эти элементы.Но есть ли способ получить индекс этого элемента в коллекции для использования с методом ElementAt вместо целых объектов?

Это будет выглядеть примерно так:

var c = select element index in collection under certain condition;
int index = c.ElementAt(0); //get first index
clusters.ElementAt(index).RunObjectMthod();

Является ли ручная итерация по всей коллекции лучшим способом?Мне нужно добавить, что он находится в большем цикле, поэтому это предложение Where выполняется несколько раз для различных someLabel строк.

Edit

Что мне нужноэто для?clusters - это набор кластеров некоторой коллекции документов.Документы сгруппированы в кластеры по сходству тем.Поэтому одним из последних шагов алгоритма является обнаружение метки для каждого кластера.Но алгоритм не идеален, и иногда он создает два или более кластеров с одинаковой меткой.Я хочу просто объединить эти кластеры в один большой.

Ответы [ 3 ]

23 голосов
/ 30 сентября 2010

Наборы обычно не имеют индексы.Если позиция важна для вас, вы должны использовать List<T> вместо (или, возможно, также) сета.

Теперь SortedSet<T> в .NET 4 немного отличаетсяв том, что он поддерживает отсортированный порядок значений.Тем не менее, он все еще не реализует IList<T>, поэтому доступ по индексу с ElementAt будет медленным.

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

8 голосов
/ 24 мая 2013

В случае, если вы храните элементы в HashSet, а иногда вам нужно получить элементы по индексу, рассмотрите возможность использования метода расширения ToList () в таких ситуациях.Таким образом, вы используете функции HashSet, а затем используете индексы.

HashSet<T> hashset = new HashSet<T>();

//the special situation where we need index way of getting elements
List<T> list = hashset.ToList();

//doing our special job, for example mapping the elements to EF entities collection (that was my case)

//we can still operate on hashset for example when we still want to keep uniqueness through the elements 
3 голосов
/ 30 сентября 2010

Нет такой вещи, как индекс с хэш-набором. Одним из способов повышения эффективности хэш-наборов в некоторых случаях является отсутствие необходимости поддерживать их.

Я тоже не вижу, в чем здесь преимущество. Если бы вы получили индекс, а затем использовали его, это было бы менее эффективно, чем просто получение элемента (получение индекса было бы в равной степени эффективным, и тогда у вас была бы дополнительная операция).

Если вы хотите выполнить несколько операций над одним и тем же объектом, просто держитесь за этот объект.

Если вы хотите что-то сделать с несколькими объектами, делайте это на основе итерации по ним (обычное foreach или выполнение foreach по результатам Where() и т. Д.). Если вы хотите сделать что-то для нескольких объектов, а затем сделать что-то еще для тех же самых объектов, и вам нужно делать это в таких пакетах, вместо того, чтобы выполнять все операции в одном foreach, тогда сохраните результаты Where() в List<T>.

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