【发布时间】:2009-04-09 18:55:25
【问题描述】:
我有两种方法可以基本上将底层复选框的文本或标记转换为 CSV 字符串。
这两种方法
- 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());
}
[UPDATE 3]将GetAsCsv()的参数设为CheckBox和字符串的封闭泛型
Func<CheckBox, T>到Func<CheckBox, string>。
这让我可以让GetAsCsv() 变得更简单、更易读。
private string GetAsCsv(Func<CheckBox, string> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(getValue).ToArray());
}
【问题讨论】:
标签: c# .net refactoring csv