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

标签 c# .net refactoring csv

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

相关文章:

c# - 后台任务有时能够更新 UI?

c# - 没有使用 log4net 从 .NET 应用程序写入 Windows Server 2008 磁盘的权限

c# - 如何创建确定性指南

c# - 递归处理文件夹中文件的快速(低级)方法

python - 在构造函数中修改其他对象的状态: design no-no?

c# - C#除法求余数和模数

c# - 创建常量 IEnumerable<TSomeType>...的方法?

c# - 使用 .NET 标准库的 ASP.NET Web 应用程序

laravel - laravel如何给用户授权

swift - "Extensions must not contain stored properties"阻止我重构代码