2012年01月22日
n回処理を繰り返したい (2)
前回「n回処理を繰り返したい (1)」の続きです。
こういった繰り返し処理の時には、何回目の処理かを知りたい場合があります。
そんな時のために、もう一つ拡張メソッドを用意しましょう。
こすれば、次のようなコードが可能になります。
参考に、for文使ったコードも示します。
こういった繰り返し処理の時には、何回目の処理かを知りたい場合があります。
そんな時のために、もう一つ拡張メソッドを用意しましょう。
こすれば、次のようなコードが可能になります。
参考に、for文使ったコードも示します。
2012年01月12日
リストのすべての要素に対しラムダ式を適用する
リストをデリゲートが返す値で埋め尽くす では、リストをデリゲート(ラムダ式)の値で初期化する拡張メソッドを
示しましたが、今度は、既にリスト内にセットされている値に対し、ラムダ式を適用し、
新たな値をセットする拡張メソッドを示します。
この拡張メソッドを利用したコードです。
ここでは、各要素を1.05倍しています。
105 210 315 420
がリストの新たな要素となります。
この例では、ラムダ式の第1引数を利用していませんが、この i には、
その要素のインデックス番号がわたるので、そのインデックス値を使って、
要素の値に対し、処理をすることもできます。
ジェネリックなメソッドにしているので、リストの要素が文字列であってもOKです。
まったく、意味のないコードですが、以下にその例を示します。
リストには、順に
"SILVERLIGHT"
"INDOWS"
"OX"
"ROSOFT"
が格納されます。
示しましたが、今度は、既にリスト内にセットされている値に対し、ラムダ式を適用し、
新たな値をセットする拡張メソッドを示します。
この拡張メソッドを利用したコードです。
ここでは、各要素を1.05倍しています。
105 210 315 420
がリストの新たな要素となります。
この例では、ラムダ式の第1引数を利用していませんが、この i には、
その要素のインデックス番号がわたるので、そのインデックス値を使って、
要素の値に対し、処理をすることもできます。
ジェネリックなメソッドにしているので、リストの要素が文字列であってもOKです。
まったく、意味のないコードですが、以下にその例を示します。
リストには、順に
"SILVERLIGHT"
"INDOWS"
"OX"
"ROSOFT"
が格納されます。
2012年01月10日
リストをデリゲートが返す値で埋め尽くす
以前アップした「リストを指定した値で埋め尽くす」をちょっと工夫すれば、さらに汎用性の高い拡張メソッドが作れます。
こんな風に使います。
これで、0 2 4 6 8 10 12 14 16 18 と要素がセットされます。
こんな風に使います。
これで、0 2 4 6 8 10 12 14 16 18 と要素がセットされます。
2011年11月29日
ToNullable拡張メソッド
var を使いたいための、拡張メソッド。
これを使えば、
int? n = 10;
ではなくて、
var n = 10.ToNullable();
と書けます。
まあ、あくまでもお遊びです。
これを使えば、
int? n = 10;
ではなくて、
var n = 10.ToNullable();
と書けます。
まあ、あくまでもお遊びです。
2011年11月23日
文字列の配列を指定区切り文字で連結する
以下のような拡張メソッドを定義しておきます。たんにJoinを呼び出しているだけのものです。
文字列の配列に格納されている文字列を、区切り記号を使い連結する拡張メソッドです。
単にJoinメソッドを呼び出しているだけのメソッドですが、インテリセンスの力が働き、
とても使いやすいメソッドに変身します。
このメソッドを使えば、以下のようなコードを書くことができます。
この実行結果は、以下のように表示されます。
123-456-789-abc-def
なお、メソッド名を Joinにしなかったのは、LINQのJoinメソッドと
混同しないようにするためです。
ところで、String.Joinって、.NET Framework4になって、オーバーロードされているメソッドの数が
増えたんですね。
Join(String, IEnumerable<String>)
とか
Join<T>(String, IEnumerable<T>)
とか。
なので、上の拡張メソッドは、以下のように書く事でさらに、汎用性が あがりますね。
このブログにC#のコードを載せたのは、実に、3ヶ月ぶりです。
文字列の配列に格納されている文字列を、区切り記号を使い連結する拡張メソッドです。
単にJoinメソッドを呼び出しているだけのメソッドですが、インテリセンスの力が働き、
とても使いやすいメソッドに変身します。
このメソッドを使えば、以下のようなコードを書くことができます。
この実行結果は、以下のように表示されます。
123-456-789-abc-def
なお、メソッド名を Joinにしなかったのは、LINQのJoinメソッドと
混同しないようにするためです。
ところで、String.Joinって、.NET Framework4になって、オーバーロードされているメソッドの数が
増えたんですね。
Join(String, IEnumerable<String>)
とか
Join<T>(String, IEnumerable<T>)
とか。
なので、上の拡張メソッドは、以下のように書く事でさらに、汎用性が あがりますね。
このブログにC#のコードを載せたのは、実に、3ヶ月ぶりです。
2010年11月23日
コンソールで処理中であることを示す文字を表示
元ネタ いろいろ備忘録日記 - コンソールで処理中であることを示す文字を表示
おもしろそうだったので、僕もやってみました。
「指定した複数の値を繰り返す」で示したRepeat拡張メソッドを使って、gsf_zero1 さんが書いたコードを書き換えています。
おもしろそうだったので、僕もやってみました。
「指定した複数の値を繰り返す」で示したRepeat拡張メソッドを使って、gsf_zero1 さんが書いたコードを書き換えています。
以下に示すコードのProgressメソッドが、処理中であることを示すメソッドです。
gsf_zero1 さんは、ラムダ式としていましたが、これをメソッドにしています。
このメソッドの中で、Repeatメソッドを使い、コンソールに表示する文字を繰り返し取得しています。
僕のコードでは、'.' 'o' 'O' '@' 'O' 'o' という6文字を繰り返して取り出し、コンソールに表示しています。
別の文字を表示したいなら、文字列 ".oO@Oo" の部分を"|/-" など別のものに置き換えるだけです。
2010年10月07日
指定した複数の値を繰り返す
前回の記事の続きです。
前回示した false true を繰り返す以下のコードは、bool型しか扱えないので、使い道が限られています。
任意の型にも対応させれば、使い道がありそうです。
ジェネリックスの出番ですね。
というクラスを作れば、
とか、
とか、いろいろ使えます。
foreach も使いたいということであれば、以下のようにGetEnumerable メソッドを追加します。
そうすれば、
なんて、書けますね。
ここまで書くと、別に要素が2つに限定することもないなーということで、
シーケンスを受け取る拡張メソッドを書いてみました。
これを使うコード例を以下に示します。
これだと、foreachでしか使えないんじゃないのと思う人もいると思いますが、いえいえ、次のような書き方もできます。
でも、使い勝手は良くないです。ラムダ式を返す部分をメソッドにしてしまったほうが良いかもしれません。
興味のある方は、EnumerableExtentions クラスにメソッドを追加してみてください。
前回示した false true を繰り返す以下のコードは、bool型しか扱えないので、使い道が限られています。
任意の型にも対応させれば、使い道がありそうです。
ジェネリックスの出番ですね。
というクラスを作れば、
とか、
とか、いろいろ使えます。
foreach も使いたいということであれば、以下のようにGetEnumerable メソッドを追加します。
そうすれば、
なんて、書けますね。
ここまで書くと、別に要素が2つに限定することもないなーということで、
シーケンスを受け取る拡張メソッドを書いてみました。
これを使うコード例を以下に示します。
これだと、foreachでしか使えないんじゃないのと思う人もいると思いますが、いえいえ、次のような書き方もできます。
でも、使い勝手は良くないです。ラムダ式を返す部分をメソッドにしてしまったほうが良いかもしれません。
興味のある方は、EnumerableExtentions クラスにメソッドを追加してみてください。
2007年08月16日
C#3.0:拡張メソッド
C#3.0:拡張メソッド
例えば、単語の先頭を大文字に変換する ToTitleCaseメソッドを作成したいという要求があったとします。
そういう場合は、StringUtilsとかいうクラスを作成し、そこに、staticメソッドを用意するのが、一般的でした。
しかし、System.Stringクラスに追加できれば、もっと使い勝手が良くなります。C#3.0では、拡張メソッドを使うことで、
という記述が可能になります。
ToTitleCase 側は、以下のようなコードになります。
拡張メソッドにするには、staticメソッドにすること、最初の引数は、this指定することが必要です。
ようは、コンパイラが、
というコードを
に置き換えてくれるわけですね。
もちろん、引数を取るメソッドやジェネリックメソッドを拡張メソッドとして定義することもできます。
例えば、単語の先頭を大文字に変換する ToTitleCaseメソッドを作成したいという要求があったとします。
そういう場合は、StringUtilsとかいうクラスを作成し、そこに、staticメソッドを用意するのが、一般的でした。
しかし、System.Stringクラスに追加できれば、もっと使い勝手が良くなります。C#3.0では、拡張メソッドを使うことで、
string s = "microsoft";
Console.WriteLine(s.ToTitleCase());
という記述が可能になります。
ToTitleCase 側は、以下のようなコードになります。
static class StringExtensions {
public static string ToTitleCase(this string s) {
var cultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
var textInfo = cultureInfo.TextInfo;
return s = textInfo.ToTitleCase(s);
}
}拡張メソッドにするには、staticメソッドにすること、最初の引数は、this指定することが必要です。
ようは、コンパイラが、
Console.WriteLine(s.ToTitleCase());
というコードを
Console.WriteLine(StringExtensions.ToTitleCase(s));
に置き換えてくれるわけですね。
もちろん、引数を取るメソッドやジェネリックメソッドを拡張メソッドとして定義することもできます。



