Сортированный список C #: как получить следующий элемент?

#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];