gpt4 book ai didi

c# - 你能从这两种方法中重构出一个共同的功能吗?

转载 作者:太空狗 更新时间:2023-10-29 19:48:29 25 4
gpt4 key购买 nike

我有两种方法基本上可以将基础复选框的文本或标记转换为 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> to Func<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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com