http://blogs.wankuma.com/rti/archive/2007/11/27/110508.aspx
C#3.0の新機能を使ってみる(その3)
http://blogs.wankuma.com/rti/archive/2007/11/21/109625.aspx
C#3.0の新機能を使ってみる(その2)
http://blogs.wankuma.com/rti/archive/2007/11/20/109453.aspx
C#3.0の新機能を使ってみる(その1)
http://blogs.wankuma.com/rti/archive/2007/11/19/109158.aspx
お疲れ様でした
・・・の続きです。
前回は足し算と引き算の2つのコードを書いてみました。
public static string CalcAdd(string value1, string value2) {
// ループカウンタの最大値を取得
var count = value1.Length > value2.Length ? value1.Length : value2.Length;
var r = String.Empty; // 計算結果を記録するための変数
var n = 0m; // 次の位への連絡用変数
for (var i = 0; i < count; ++i) {
// 各位ごとに足し算を行う
n = value1.GetOneDigit(i) + value2.GetOneDigit(i) + n;
// 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
r = (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
n = Math.Floor(n / 10); // 10 の位の値は、次の位で加算される
}
if (n > 0) r = n.ToString() + r;
return r.TrimStart('0');
}
public static string CalcSub(string value1, string value2) {
// ループカウンタの最大値を取得
var count = value1.Length > value2.Length ? value1.Length : value2.Length;
var r = String.Empty; // 計算結果を記録するための変数
var n = 0m; // 次の位への連絡用変数
for (var i = 0; i < count; ++i) {
// 各位ごとに引き算を行う
var t = value1.GetOneDigit(i) - value2.GetOneDigit(i) - n;
n = t < 0 ? t + 20: t; // 結果がマイナスなら、20を加算する
// 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
r = (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
n = Math.Floor(n / 10); // 10 の位の値は、次の位で減算される
}
if (n > 0) r = n.ToString() + r;
return r.TrimStart('0');
}
赤字の部分を除いて同じ処理なのでメソッドアウトします。
異なる処理部分は、
ラムダ式
を使います。
public static string CalcAdd(string value1, string value2) {
return Simplecalculation(value1, value2, (n, d1, d2) => n + d1 + d2);
}
public static string CalcSub(string value1, string value2) {
return Simplecalculation(
value1, value2,
(n, d1, d2) => {
var r = d1 - d2 - n;
return r < 0 ? r + 20: r;
}
);
}
private static string Simplecalculation(string value1, string value2, Func<decimal, decimal, decimal, decimal> func){
// ループカウンタの最大値を取得
var count = Math.Max(value1.Length, value2.Length); // 今回は Math.Max を使ってみます
var r = String.Empty; // 計算結果を記録するための変数
var n = 0m; // 次の位への連絡用変数
for (var i = 0; i < count; ++i) {
// 各位ごとに適切な演算を行う処理を委譲する
n = func(n, value1.GetOneDigit(i), value2.GetOneDigit(i));
// 結果を 1 と 10 の位の値に分離。(10 → 1, 0)
r = (n % 10).ToString() + r; // 1 の位は、結果の文字列の右に付け加える
n = Math.Floor(n / 10); // 10 の位の値は、次の位で減算される
}
if (n > 0) r = n.ToString() + r;
return r.TrimStart('0');
}
こんな感じになります。
詳細は次回から少しずつ触れていこうかと思っています。
・・・(つづく)