c# SortedSet как получить элемент

Я довольно новичок в этом, так что простите мой noobishness здесь.

Я пытаюсь отредактировать элемент в отсортированном наборе С#, если обнаружу, что этот элемент существует. Поэтому я могу использовать list.contains(value) и обнаружить, что значение существует в списке. Но как мне убрать этот пункт из списка. Вот что у меня есть. Это становится очень медленным, так как размер моего списка становится очень большим, поэтому я предполагаю, что должен быть лучший способ, чем этот.

if (list.Contains(p))
{
     Person exists = list.First(person => person.Name.Equals(line[0]));
     // do something here to exists
}
else
{
    // just add the person to the list
}

person Matthew The Terrible    schedule 24.10.2013    source источник
comment
Вот почему коллекции C++ std — единственные известные мне хорошо разработанные коллекции. Я понятия не имею, почему C# и Java не возвращали итераторы из своих методов поиска, указывающих на найденный элемент. Может быть, я просто хотел найти элемент, чтобы захватить следующий самый большой элемент (который, да, мне нужен в коде, и это легко в отсортированных коллекциях С++)   -  person    schedule 04.04.2018


Ответы (4)


Вам действительно нужно SortedSet красно-черное дерево? Если вам не нужна сортировка, вы не должны ее использовать. Рассматривали ли вы вместо этого HashSet или Dictionary, что более подходит (быстро) для получения элемента по ключу?

В вашем случае вам, вероятно, нужно создать экземпляр Dictionary с ключом, равным имени человека, то есть:

Dictionary<string, Person> list;

Затем вы можете получить человека по его имени, сложность O (1)

if(list.ContainsKey(line[0]))
{
    list[line[0]]...
}

или еще лучше:

Person p;

if(list.TryGetValue(line[0], out p))
{
    p...
)
person Kirill Polishchuk    schedule 24.10.2013
comment
Ну, я думаю, мне не нужно их сортировать. Сортировать было бы неплохо, но я могу справиться с тем, что они не сортируются. Как я могу получить элемент из хэш-набора по ключу? - person Matthew The Terrible; 24.10.2013
comment
Я только что понял, что мог бы использовать этот код, и он намного быстрее. Человек существует = list.FirstOrDefault(person => person.Name == p.Name); Я не знаю, почему я использовал Where. Это замедляло все до минимума, потому что по мере того, как мой список рос, мне приходилось искать все больше и больше имен… Тьфу. - person Matthew The Terrible; 24.10.2013
comment
@MatthewTheTerrible, :) В любом случае, вы можете проверить Dictionary - person Kirill Polishchuk; 24.10.2013
comment
О, да, твой путь мне нравится гораздо больше. - person Matthew The Terrible; 24.10.2013
comment
Это не отвечает на исходный вопрос OP - person DrKoch; 29.01.2015
comment
на какой структуре данных основан словарь С#? - person SuB; 28.05.2018
comment
@SuB, хеш-таблица - person Kirill Polishchuk; 28.05.2018

Начиная с .NET Framework 4.7.2 существует метод TryGetValue доступен для SortedSet.

person Oleksa    schedule 21.05.2018

Невозможно получить элемент из коллекций SortedSet или HashSet (методом Contains или каким-то другим способом). Можно просто узнать, содержит ли коллекция элемент. Поскольку для того, чтобы найти этот элемент в коллекции, он уже использует этот элемент (передавая его методу Contains), можно предположить, что этот элемент уже есть.

person Jordan    schedule 26.03.2015

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

person ulatekh    schedule 20.03.2019