私は、基礎となるチェックボックスのテキストまたはタグを基本的にCSV文字列として変換する2つのメソッドを持っています。
これらの2つの方法から共通の機能をリファクタリングできますか?
これらの2つの方法
- GetSelectedTextAsCsv()
- GetTagAsCsv()
のみれる性は型であるSelectedCheckBoxes
から値を抽出するために異なるIList<CheckBox>
public string GetSelectedTextAsCsv()
{
var buffer = new StringBuilder();
foreach (var cb in SelectedCheckBoxes)
{
buffer.Append(cb.Text).Append(",");
}
return DropLastComma(buffer.ToString());
}
public string GetTagAsCsv()
{
var buffer = new StringBuilder();
foreach (var cb in SelectedCheckBoxes)
{
buffer.Append(cb.Tag).Append(",");
}
return DropLastComma(buffer.ToString());
}
私はFunc<T, TResult>
を返すメソッドを抽出しようとしていましたが、どのように取り除くことができないのかはわかりません。 私の貧弱な試みは、以下のようなものだったが、私は、私は間違ってトラックに午前いる場合、あなたはどのように私ができるの私に助言してくださいだろうConvertToCsv()
public Func<T, string> ConvertToCsv<T>()
{
return propertyName =>
{
var buffer = new StringBuilder();
foreach (var checkBox in SelectedCheckBoxes)
{
buffer.Append(
/* How can you abstract this portion? like following? */
checkBox.propertyName
).Append(",");
}
return DropLastComma(buffer.ToString());
};
}
内のコメントに示すように、プロパティ部分を抽出する方法を見つけ出すことはできません一般的な方法を使用するコードの上のリファクタリング?
[UPDATE 1]ここでブライアンとジョンの答え
public string ConvertToCsv<T>(Func<CheckBox, T> getValue)
{
var stringValues = SelectedCheckBoxes.Select(
cb => getValue(cb).ToString()).ToArray();
return string.Join(",", stringValues);
}
public string GetSelectedTextAsCsv()
{
return ConvertToCsv(cb => cb.Text);
}
public string GetTagAsCsv()
{
return ConvertToCsv(cb => cb.Tag);
}
両方の組み合わせである[UPDATE 2]バージョン2
public string GetAsCsv<T>(Func<CheckBox, T> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(
cb => getValue(cb).ToString()).ToArray());
}
public string GetSelectedTextAsCsv()
{
return GetAsCsv(cb => cb.Text);
}
public string GetTagAsCsv()
{
return GetAsCsv(cb =>
cb.Tag == null ? string.Empty : cb.Tag.ToString());
}
[UPDATE 3]メイド CheckBoxおよび文字列の閉じた汎用としてGetAsCsv()
のパラメータ
Func<CheckBox, T>
~Func<CheckBox, string>
。
これにより、私はGetAsCsv()
をさらに簡単で読みやすくすることができました。
private string GetAsCsv(Func<CheckBox, string> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(getValue).ToArray());
}
私は実際にあなたのソリューションとJon'sを使用しています。決定するのが難しい... – Sung
w00t!機能プログラミング:) – Juliet
@Princess:それは関数型プログラミングのアプローチですか?私はそれを意識していなくても... – Sung