Вывод номеров всех вхождений

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8
Всем привет.
Задача: Вывести порядковые номера всех вхождений элемента типа стринг в список.
Код:
C#:
var target = project.Variables["target_text"].Value;
var list = project.Lists["tmp_list"];
int i = -1;
return string.Join(",",list.Where(x=>x==target).Select(x=>{ i=list.IndexOf(target);
return i;
}
)
)
;
Переменная target_text содержит: track tmp
Список tmp_list содержит:
0 track downloaded
1 track downloaded
2 track
3 track
4 track tmp
5 track tmp
6 track tmp
7 track tmp
8 track
9 track downloaded
10 track tmp

Код выводит: 4,4,4,4,4 (количество вхождений при номере первого вхождения (IndexOf))
А нужно чтобы выводил: 4,5,6,7,10
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
нужен готовый код или понимание, что не так с этим, и направление, куда копать?
 

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8
нужен готовый код или понимание, что не так с этим, и направление, куда копать?
ну я понимаю что возможно проблема в методе IndexOf т.к. он выводит номер только первого значения.
Но вот куда дальше копать не имею понятия. Готовый код хоть и спасет конечно, но важнее понимание что и как.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
ну я понимаю что возможно проблема в методе IndexOf т.к. он выводит номер только первого значения.
Но вот куда дальше копать не имею понятия. Готовый код хоть и спасет конечно, но важнее понимание что и как.
тебе нужно отказаться от концепций where select. Там уже идёт полный перебор всех элементов, увы, без доступа к индексу(насколько мне известно). А ты на этот перебор накладываешь сверху перебор через индексоф. У индексОф есть перегрузка, которая принимает 2 входных значения - искомое значение и позиция, откуда начинать поиск. Тебе нужно в бесконечном цикле долбить этот индексОф, где в поле позиции поиска должен быть индекс+1 последнего удачно найденного элемента. Т.е. таким образом. ты сначала даёшь индексОф начиная с 0 элемента, он возвращает 4. В след итерации ты даёшь поиск с 5го элемента, он возвращает 5. Потом с 6го... Когда поиск вернёт -1 - выход из цикла, поиск завершен
 
  • Спасибо
Реакции: Maxx

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
Задача именно через Where сделать?
По-моему, проще некуда классическим циклом прогнать все элементы списка, if-ом сравнить через Contains и счетчик положить в массив.
 

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8
Задача именно через Where сделать?
По-моему, проще некуда классическим циклом прогнать все элементы списка, if-ом сравнить через Contains и счетчик положить в массив.
в идеале я бы хотел получить номера вхождений по типу 4,5,6,7,10. Вхождения может быть много (до 5000). Цикл может медленно работать.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
в идеале я бы хотел получить номера вхождений по типу 4,5,6,7,10. Вхождения может быть много (до 5000). Цикл может медленно работать.
если в коде нет стандартных цикловых конструкций это не значит, что там нет цикла) и where и select те же циклы)
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
5000, если тексты не особо длинные (до тысячи символов), это пробежится за несколько секунд.
Вообще удивляет оптимизация для Зенно. Тут только старт проекта несколько секунд, а экономят на миллисекундах, как в какой-нибудь игре)
 

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8
можно ли в данном примере применить оператор foreach?
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
а, я думал, что сами сможете "скрестить" свой код и указанный
как-то так:
Код:
var target = project.Variables["target_text"].Value;
var list = project.Lists["tmp_list"];
return string.Join(",", list.Select((Value, Index) => new { Value, Index }).Where(x=>x.Value==target).Select(x=>x.Index).ToList());
 
  • Спасибо
Реакции: doc и Maxx

Maxx

Client
Регистрация
30.04.2015
Сообщения
37
Благодарностей
1
Баллы
8
а, я думал, что сами сможете "скрестить" свой код и указанный
прощу прощения и спасибо. Исправил. Немного по другому но работает. Так кстати тоже работает. Не отписался вовремя т.к. спешил на радостях дописать до конца под нужды дабы запустить.
Всем спасибо. Тема закрыта.
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)