Списковый тип с возможностью обхода с произвольного элемента
От: MxMsk Португалия  
Дата: 23.11.10 10:26
Оценка:
Всем привет.

Есть у меня список, и мне требуется последовательно обойти все его элементы. Однако затык: начаться обход может с любого элемента списка. Я думал, что такое легко проделать при помощи LinkedList, если зациклить последний элемент на первый, но оказалось, что этот класс такой фичи не поддерживает. Конечно, можно добиться желаемого простым массивом и комбинацией Linq-овых Skip и Take, но может в .Net есть какая-нибудь готовая структура данных?
Re: Списковый тип с возможностью обхода с произвольного элем
От: Undying Россия  
Дата: 23.11.10 10:41
Оценка: 1 (1)
Здравствуйте, MxMsk, Вы писали:

MM>Конечно, можно добиться желаемого простым массивом и комбинацией Linq-овых Skip и Take


Зачем так сложно? Не проще за пять копеек написать универсальную функцию?

IEnumerable<T> CyclicRound<T>(IList<T> items, int firstItemIndex)
{
  for (int i = 0; i < items.Length; ++i)
  {
    int index = (i + firstItemIndex) % items.Length;
    yield return items[index];
  }
}
Re[2]: Списковый тип с возможностью обхода с произвольного э
От: MxMsk Португалия  
Дата: 23.11.10 10:49
Оценка:
Здравствуйте, Undying, Вы писали:

U>Зачем так сложно? Не проще за пять копеек написать универсальную функцию?

Сейчас так и сделано. Чешется просто, вдруг есть что готовенькое
Re[3]: Списковый тип с возможностью обхода с произвольного э
От: Undying Россия  
Дата: 23.11.10 10:55
Оценка: +2
Здравствуйте, MxMsk, Вы писали:

U>>Зачем так сложно? Не проще за пять копеек написать универсальную функцию?

MM>Сейчас так и сделано. Чешется просто, вдруг есть что готовенькое

Объясни чем готовенькое может быть проще и лучше?
Re[4]: Списковый тип с возможностью обхода с произвольного э
От: MxMsk Португалия  
Дата: 23.11.10 11:01
Оценка:
Здравствуйте, Undying, Вы писали:

U>Объясни чем готовенькое может быть проще и лучше?

Не придумывать еще один велосипед
Re[5]: Списковый тип с возможностью обхода с произвольного э
От: Undying Россия  
Дата: 23.11.10 11:09
Оценка:
Здравствуйте, MxMsk, Вы писали:

U>>Объясни чем готовенькое может быть проще и лучше?

MM>Не придумывать еще один велосипед

Свой маленький велосипед, решающий конкретную задачу, всегда лучше, чем чужой большой велосипед с кучей ненужного функционала.
Re[5]: Списковый тип с возможностью обхода с произвольного э
От: Sinix  
Дата: 23.11.10 12:01
Оценка: +2 :)))
Здравствуйте, MxMsk, Вы писали:

U>>Объясни чем готовенькое может быть проще и лучше?

MM>Не придумывать еще один велосипед
Увы, гусеничные велосипеды с гарпуном для подводной охоты и минибаром спросом не пользуются, а посему в фреймворк не входят.
Re[6]: Списковый тип с возможностью обхода с произвольного э
От: MxMsk Португалия  
Дата: 23.11.10 14:04
Оценка:
Здравствуйте, Sinix, Вы писали:

U>>>Объясни чем готовенькое может быть проще и лучше?

MM>>Не придумывать еще один велосипед
S>Увы, гусеничные велосипеды с гарпуном для подводной охоты и минибаром спросом не пользуются, а посему в фреймворк не входят.
Ну хорошо. Я же просто спросил
Re[2]: Списковый тип с возможностью обхода с произвольного э
От: Lloyd Россия  
Дата: 23.11.10 14:09
Оценка: +1
Здравствуйте, Undying, Вы писали:

U>Зачем так сложно? Не проще за пять копеек написать универсальную функцию?


U>
U>IEnumerable<T> CyclicRound<T>(IList<T> items, int firstItemIndex)
U>{
U>  for (int i = 0; i < items.Length; ++i)
U>  {
U>    int index = (i + firstItemIndex) % items.Length;
U>    yield return items[index];
U>  }
U>}
U>


Это очень неэффективно для LinkedList-а. Кроме того не отслеживается модификация исходного списка.
Re[7]: Списковый тип с возможностью обхода с произвольного э
От: Sinix  
Дата: 23.11.10 14:40
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Ну хорошо. Я же просто спросил

А я просто ответил
Если воспринялось как наезд — тыщща извинений, и в мыслях не было
Re[8]: Списковый тип с возможностью обхода с произвольного э
От: MxMsk Португалия  
Дата: 23.11.10 14:47
Оценка: :)
Здравствуйте, Sinix, Вы писали:

S>Если воспринялось как наезд — тыщща извинений, и в мыслях не было

Да мне только минибар нужен был, а ты сразу про гарпун с гусеницами

P.S.
Re[6]: Списковый тип с возможностью обхода с произвольного э
От: Аноним  
Дата: 23.11.10 16:12
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, MxMsk, Вы писали:


U>>>Объясни чем готовенькое может быть проще и лучше?

MM>>Не придумывать еще один велосипед
S>Увы, гусеничные велосипеды с гарпуном для подводной охоты и минибаром спросом не пользуются, а посему в фреймворк не входят.

а в чем недостатки? ну не неужно минибара мне — я не буду использовать его возбму горпун пока.
Re[7]: Списковый тип с возможностью обхода с произвольного э
От: Sinix  
Дата: 23.11.10 16:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а в чем недостатки? ну не неужно минибара мне — я не буду использовать его возбму горпун пока.

Дарю:
Re[8]: Списковый тип с возможностью обхода с произвольного э
От: Аноним  
Дата: 23.11.10 16:48
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>а в чем недостатки? ну не неужно минибара мне — я не буду использовать его возбму горпун пока.

S>Дарю:
S>

взял. спасибо!
а теперь к нашим баранам вернемся — не нужна часть лишнего функционала — не юзай, в чем минусы то?
Re[3]: Списковый тип с возможностью обхода с произвольного э
От: Pavel Dvorkin Россия  
Дата: 23.11.10 17:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Undying, Вы писали:


U>>Зачем так сложно? Не проще за пять копеек написать универсальную функцию?


U>>
U>>IEnumerable<T> CyclicRound<T>(IList<T> items, int firstItemIndex)
U>>{
U>>  for (int i = 0; i < items.Length; ++i)
U>>  {
U>>    int index = (i + firstItemIndex) % items.Length;
U>>    yield return items[index];
U>>  }
U>>}
U>>


L>Это очень неэффективно для LinkedList-а.


Угу. Фактически это превращение O(N) в O(N^2).

По идее тут надо один раз пройти до этого самого firstItemIndex (до итераций), а потом идти до конца, а потом с начала до него же.
With best regards
Pavel Dvorkin
Re[9]: Списковый тип с возможностью обхода с произвольного э
От: Sinix  
Дата: 23.11.10 17:13
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>а теперь к нашим баранам вернемся — не нужна часть лишнего функционала — не юзай, в чем минусы то?


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

Подобных юз-кейзов тысячи, и тащщить их все в фреймворк незачем.
Re[10]: Списковый тип с возможностью обхода с произвольного
От: Аноним  
Дата: 23.11.10 17:20
Оценка:
Здравствуйте, Sinix, Вы писали:

S>В том, что предложенный сценарий обхода

S>1. очень специфичен
S>2. очень легко реализовать самому

S>Подобных юз-кейзов тысячи, и тащщить их все в фреймворк незачем.


Нет. просто создатели соотв. интерфейса не учли этого момента. (ошиблись, забыли, забили, наняли индусов ).
Ничего страшного.

зы.как описано ниже — не так уж и легко с правильным быстродействием.
Re[11]: Списковый тип с возможностью обхода с произвольного
От: Sinix  
Дата: 23.11.10 17:36
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Подобных юз-кейзов тысячи, и тащщить их все в фреймворк незачем.


А>Нет. просто создатели соотв. интерфейса не учли этого момента. (ошиблись, забыли, забили, наняли индусов ).

Учли. Я сильно советую почитать блоги от авторов языка, перед тем как высказывать скоропалительные суждения по его дизайну. Например, классика.

А>зы.как описано ниже — не так уж и легко с правильным быстродействием.

Померяйте как нить изврат в виде
source.Skip(startIndex).Take(source.Count-startIndex).Join(source.Skip(startIndex))


Даже этот кошмар имеет пристойное быстродействие. Правильный итератор написать не проблема, поверьте.
Re[11]: Списковый тип с возможностью обхода с произвольного
От: Sinix  
Дата: 23.11.10 17:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Упс, конечно же
source.Skip(startIndex).Take(source.Count-startIndex).Concat(source.Skip(startIndex))
Re[10]: Списковый тип с возможностью обхода с произвольного
От: MxMsk Португалия  
Дата: 23.11.10 17:46
Оценка:
Здравствуйте, Sinix, Вы писали:

S>В том, что предложенный сценарий обхода

S>1. очень специфичен
S>2. очень легко реализовать самому
А все же жаль, что нельзя зациклить Linked List!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.