web-dev-qa-db-ja.com

Linqを使用してWhere句の後に配列インデックスを選択する方法

配列_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_のインデックスをWhere()句の後に取得しているため、これは_IEnumberable<string>_を返します。 Select()を最初に置いた場合、私が持っているのはインデックスだけであり、日数でフィルタリングすることはできません。

それを機能させ、代わりに_1,2,3_を返すために何を変更する必要がありますか?

27
mikel

あなたはこのようにすることができます:

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

これが最適かどうかわかりません。

36
Patko

Patkoの答えは、一般的な場合の方法です。

さらに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's idea, except using a 'named' type.
int[] indices = weekDays.AsSmartEnumerable()
                        .Where(item => item.Value.Contains("s"))
                        .Select(item => item.Index)
                        .ToArray();
15
Ani