我有两种方法基本上可以将基础复选框的文本或标记转换为 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());
};
}
如果我走错了路,你能告诉我如何重构上面的代码以使用通用方法吗?
[UPDATE 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>
toFunc<CheckBox, string>
.
这让我可以制作 GetAsCsv()
更简单,更易读。
private string GetAsCsv(Func<CheckBox, string> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(getValue).ToArray());
}
最佳答案
public string GetAsCsv(Func<CheckBox, string> getValue)
{
var buffer = new StringBuilder();
foreach (var cb in SelectedCheckBoxes)
{
buffer.Append(getValue(cb)).Append(",");
}
return DropLastComma(buffer.ToString());
}
然后:
GetAsCsv(cb => cb.Tag != null ? cb.Tag.ToString() : string.Empty);
GetAsCsv(cb => cb.Text);
关于c# - 你能从这两种方法中重构出一个共同的功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735473/