foreachのラッパー

最近、コードの煩わしさ、不器用な構成、余分な行の存在に悩まされ始めました。

コードスタイルに応じた単純なforeachは、少なくとも4行のテキストになります
foreach ( var element in collection)

{

// Do something

}


* This source code was highlighted with Source Code Highlighter .




したがって、このようなラッパーが形成されました。
public static IEnumerable <T> Each<T>( this IEnumerable <T> list, Action<T> func)

{

if (func == null )

{

return list;

}

if (list == null )

{

return null ;

}

foreach ( var elem in list)

{

func(elem);

}

return list;

}


* This source code was highlighted with Source Code Highlighter .




引数をチェックするとき、 throw new ArgumentNullExceptionを記述する方が便利かもしれませんが、私のタスクでは、「failed、okay」メカニズムを使用することをお勧めします。



さらに、使用中に、処理中の要素のインデックスを知る必要があるときに問題に遭遇しました。 このため、次の拡張子を使用しました。
public static IEnumerable <T> Each<T>( this IEnumerable <T> list, Action<T, int > func)

{

if (func == null )

{

return list;

}

if (list == null )

{

return null ;

}

int i = 0;

foreach ( var elem in list)

{

func(elem, i);

i++;

}

return list;

}


* This source code was highlighted with Source Code Highlighter .




さまざまなハンディキャップを交換するのがもう少し便利になりました。 コードがより美しくなりました。

使用例:

// .

ddSelector.Items. Cast <ListItem>().Each((x, i) => x.Text = (i+1) + ": " + x.Text);

//

radioButtonList1.Items. Cast <ListItem>().Each(x => x.Selected = true );

// , - Add AddRange.

listToAdd.Each(someObject.Add);

// object.Add , .


* This source code was highlighted with Source Code Highlighter .




ある時点から、別の問題に遭遇しました。

長い一連のメソッドとLinqがあり、次にそれぞれEach、次にLinq、もう一度Each、そしてコレクション全体が地獄に渡されます。このコレクションの最初の10個の最初の要素のみが既に使用されています。

すべてが計算され、実行され、割り当てられ、誰も結果を必要としないことがわかりました。 この悪さを克服するために、私はリストを別のEachで補充する必要がありました。
public static IEnumerable <T> EachLazy<T>( this IEnumerable <T> list, Action<T> func)

{

foreach ( var elem in list)

{

func(elem);

yield return elem;

}

}


* This source code was highlighted with Source Code Highlighter .




yield returnコンストラクトのおかげで、本当に値が必要なときにのみアクションが実行されるようになります。

したがって、構造を書くことが可能になりました

Return ArrayOfInstances.EachLazy(x => x.Parametr = defaultValue).Select(x => x.SomeValue)

.EachLazy(x => x.Parent = null );



ここにそのような人工の砂糖があります。



All Articles