Подтвердить что ты не робот

Как выбрать индекс массива после предложения Where, используя Linq?

Предположим, что у меня есть массив string[] weekDays = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };, и я хочу узнать индекс элементов массива, содержащий 's'. Как это сделать с помощью Linq?

Я пробовал int[] indexOfDaysContainingS = weekDays.Where(day => day.Contains("s")).Select((day, index) => index).ToArray();, но это возвращает 0,1,2, поскольку, по-видимому, он получает индекс отфильтрованного IEnumberable<string> после предложения Where(). Если я сначала поставлю Select(), то все, что у меня есть, является индексом и не может фильтроваться по дням.

Что мне нужно изменить, чтобы заставить его работать и вернуть 1,2,3 вместо этого?

4b9b3361

Ответ 1

Вы можете сделать это следующим образом:

weekDays.Select((day, index) => new { Day = day, Index = index })
        .Where(x => x.Day.Contains("s"))
        .Select(x => x.Index)
        .ToArray();

Не уверен, что это оптимально.

Ответ 2

Ответ Патко - это путь в общем случае.

Вот еще 2 варианта:

// Idea only works with collections that can be accessed quickly by index.
int[] indices = Enumerable.Range(0, weekDays.Length)
                          .Where(index => weekDays[index].Contains("s"))
                          .ToArray();

С MoreLinq:

// Similar to Patko idea, except using a 'named' type.
int[] indices = weekDays.AsSmartEnumerable()
                        .Where(item => item.Value.Contains("s"))
                        .Select(item => item.Index)
                        .ToArray();

Ответ 3

Это должно работать:

weekDays.Where(a => a.Contains("s")).Select((a, i) => i).ToArray();