#c# #sortedlist
#c# #сортированный список
Вопрос:
Мне интересно, как получить следующий элемент в отсортированном списке C #. НА данный момент я придумал следующий код:
SortedList<int, Bla> mList;
Bla someElement = mList[key];
Bla next = mList[mList.Keys[mList.IndexOfKey(key) 1]];
Я не уверен, что это самый умный способ сделать это 😉
Комментарии:
1. Ой, извините. Я добавил объявление списка…
2. Разве вы не можете просто сохранить отдельную переменную index?
3. foreach (запись KeyValuePair<int, Bla> в mList){ … } ????
4. Используйте IndexOfKey и GetByIndex.
5. @HansPassant Если вы опубликуете это в качестве ответа, я поддержу его. Все остальные здесь, похоже, неспособны ответить на вопрос, который был фактически задан.
Ответ №1:
Поскольку вы можете получить доступ к списку SortedList
по индексу (см. Раздел Примечания), я бы рекомендовал использовать следующее:
var index = mList.IndexOfKey(key);
var first = mList.Values[index];
var second = mList.Values[index 1];
Это будет работать так же O(log n)
, как и при одиночном поиске.
Вот также способ LINQ сделать это:
var items = mList.SkipWhile(m => m.Key != key).Select(m => m.Value).Take(2).ToList(); // Avoid double-enumeration by calling ToList
var first = mList[0];
var second = mList[1];
Это будет перечисляться только один раз. Он будет выполнен в O(n)
.
Комментарии:
1. Это действительно сделало свое дело. Большое спасибо!
Ответ №2:
К сортированному списку можно получить доступ как по ключу, так и по индексу
var IndexOfKey = mList.IndexOfKey(key);
Увеличьте индекс,
IndexOfKey ; //Handle last index case
Получите следующий элемент по индексу.
var nextElement = mList.GetByIndex(IndexOfKey);
Комментарии:
1. Относится ли это к
SortedList<int, Bla>
? Список сортировки в разделе Generics не отображаетсяGetByIndex
, если я что-то не истолковал неправильно2. @Boris… Я думал, вы используете SortList
3. Я надеюсь, что голосов «за» не будет, поскольку ХансПассант предложил это в комментариях
4. @V4Vendetta Сила предложения 🙂 Хотя это хороший ответ, если
GetByIndex
он существовал. На самом деле вы должны использоватьmList.Values[index]
.5. @ScottRippey Это происходит в списке сортировки, найденном в MSDN
Ответ №3:
Используйте перечислитель:
IDictionaryEnumerator iterator = mList.GetEnumerator();
iterator.MoveNext();
Bla first = iterator.Value;
iterator.MoveNext();
Bla next = iterator.Value;
Комментарии:
1. Но у OP, как я думал, уже был элемент, для которого он хотел найти следующий
2. Это правда. Я хотел бы найти элемент в списке (желательно очень быстро), а затем выполнить итерацию оттуда…
3. Это возвращает первые 2 элемента и даже не утруждает себя просмотром
key
.
Ответ №4:
SortedList<int, Bla> mList;
int key = 0;
Bla someElement = mList.Values[key];
...
key = 1;
Bla next = mList.Values[key];