スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

繰り返し文をLINQっぽく

プログラミングにおいては、基本でありメジャーである繰り返し文。Cで言えばfor文。
.NET1.1の頃は、
for (int i = 0; i < 100; i ++) {
//...
}

foreach (var item in list) {
//...
}
というものだった。(他にもdoやwhileもある)。
C#2.0でGenericができ、C#3でLINQやラムダ式が追加されてからは、以下のような書き方もできる。

var list1 = new []{1, 2, 3};
Array.ForEach(list1, elem => {
//...
});
ただし、これは配列だけ。

var list2 = new List<int>(3){1, 2, 3};
list2.ForEach(elem => {
//...
});
ただし、これはList<>専用。
LINQにはSelectはあってもForEach的なメソッドが見当たらない。まあ、目的が微妙に異なるからかもしれないけど。じゃ、ないなら作ろうという事で、以下の3種類を作ってみた。
using System;
using System.Collections.Generic;
using System.Text;

namespace TawamureDays {

/// <summary>
/// 戯れる為のユーティリティ用クラス
/// </summary>
public static class Utils {

/// <summary>
/// ただのforeach
/// </summary>
/// <typeparam name="T">リスト要素のタイプ宣言</typeparam>
/// <param name="list">リスト</param>
/// <param name="action">各要素に対して実行するメソッド</param>
public static void ForEach<T>(IEnumerable<T> list, Action<T> action) {

if (list == null) {
return;
}

if (action == null) {
throw new ArgumentNullException("action");
}

foreach (var elem in list) {
action(elem);
}

return;
}

/// <summary>
/// 途中終了可能なforeach(break機能追加)
/// </summary>
/// <typeparam name="T">リスト要素のタイプ宣言</typeparam>
/// <param name="list">リスト</param>
/// <param name="action">各要素に対して実行するメソッド</param>
public static void ForEach<T>(IEnumerable<T> list, Func<T, bool> action) {

if (list == null) {
return;
}

if (action == null) {
throw new ArgumentNullException("action");
}

foreach (var elem in list) {
if (!action(elem)) {
break;//終了
}
}

return;
}

/// <summary>
/// 途中終了可能なforeach(break機能追加) インデックス付
/// </summary>
/// <typeparam name="T">リスト要素のタイプ宣言</typeparam>
/// <param name="list">リスト</param>
/// <param name="action">各要素に対して実行するメソッド</param>
public static void ForEach<T>(IEnumerable<T> list, Func<T, int, bool> action) {

if (list == null) {
return;
}

if (action == null) {
throw new ArgumentNullException("action");
}

var idx = 0;

foreach (var elem in list) {
if (!action(elem, idx ++)) {
break;//終了
}
}

return;
}
}
}

1つ目:ただのForEach文を多少簡素にできるだけ。ただし、break文は書けないし、continueもできない。簡易版ForEach。
2つ目:↑にbreak機能をつけたもの。でもcontinueは相変わらずできない。
3つ目:↑にインデックスをつけたもの。「最初の要素」や「最後の要素」を知りたい時に便利?
引数をIEnumerable<>にしているので、基本リストならほぼなんでもありと言える。

var list1 = new []{1, 2, 3};
var list2 = new List(3){1, 2, 3};
IList list3 = new List(3){1, 2, 3};

Utils.ForEach(list1, elem => {});
Utils.ForEach(list2, elem => {});
Utils.ForEach(list3, elem => {});
Utils.ForEach(list3, (elem, idx) => {
//...
return true;
});

でも、これはforeachに言える事なので、単に書き方をLINQっぽくできるというだけかもしれない。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。