2010-11-20 10 views
27

配列がstring[] weekDays = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };で、 's'を含む配列要素のインデックスを探したいとします。どうすればLinqを使ってこれを行うことができますか?Linqを使用してWhere節の後に配列インデックスを選択する方法は?

私はint[] indexOfDaysContainingS = weekDays.Where(day => day.Contains("s")).Select((day, index) => index).ToArray();を試しましたが、代わりにIEnumberable<string>のインデックスを取得しているので、0,1,2が返されます。私がSelect()を最初に置くと、私が持っているものはすべてインデックスであり、その日までにフィルタリングすることはできません。

代わりに1,2,3を返品するには、何を変更する必要がありますか?

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

これが最適であるかどうかわからない。..

+0

私はそれが問題の一部ではありません知っているが、なぜドン」これを行うには、Linqの代わりにforループを使用します。あなたは多くの開発時間を節約できました。 –

答えて

34

あなたは、このようにそれを行うことができます。これは動作するはず

// 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(); 
+1

+1。明快にするために再フォーマット。あなたが気にしないと願っています。 – Ani

+0

@Ani - ありがとう。私は適切に行く前に私は正しく起きるべきだと思う:) – Patko

+0

@Patkoしかし、どのように配列からインデックスを取得し、インデックスプロパティに配置する "インデックス"に関連付けることを知ったのですか? –

15

Patkoの答えは、一般的なケースでは移動するための方法である:

+0

代替案をありがとう。あなたの最初の選択肢とパトコの大きな配列の答えを比較すると、パフォーマンスが違う理由はありますか?私はどちらが最適な選択か分からない。 – mikel

+1

@ miket2e:パトコの答えは一般的なものです。「Range」アプローチは非リストシーケンスではうまく機能しません。 「公正」な比較をするのは難しいです。配列の場合、 'Range'アプローチが高速になると思うでしょう - おそらく*ヒープ割り当てが少なくなるかもしれません。おそらくキャッシュフレンドリーなのかもしれません。私を信じてはいけない、測定! *多分あなたはLINQを使っていてはいけません。 – Ani

+1

(1 less enumerator) – Ani

-1

MoreLinq

// 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(); 

:ここ

は2つのより多くのオプションです

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

コードの書式設定ツールを使用して答えを説明してください – NSNoob

+0

返されるインデックス値は、コレクションが元のインデックスではなく既にフィルタリングされているので、この例で論理が正しいとは思わないコレクション。 –

関連する問題