我有两种方法,基本上可以将底层复选框的文本或标签转换为CSV字符串。
这两种方法如下:
如果我走错了路,请您告诉我如何重构上面的代码以使用公共方法?
[更新1] 这是Brian和Jon答案的结合。
这两种方法如下:
- 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());
};
}
如果我走错了路,请您告诉我如何重构上面的代码以使用公共方法?
[更新1] 这是Brian和Jon答案的结合。
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);
}
[更新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());
}
[更新3] 将GetAsCsv()
的参数更改为CheckBox和string的封闭泛型。
从
Func<CheckBox, T>
更改为Func<CheckBox, string>
。
这使得GetAsCsv()
变得更简单、更易读。
private string GetAsCsv(Func<CheckBox, string> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(getValue).ToArray());
}