你可以重构了这两个方法的一个共同的功能?你可以、这两个、重构、功能

2023-09-03 06:59:27 作者:我用十年换你一句好久不见

我有两个方法,基本上皈依基本复选框的文字或标记为CSV字符串。

这两种方法

GetSelectedTextAsCsv() GetTagAsCsv()

唯一区别是它的属性的从 SelectedCheckBoxes ,这是类型中获取价值的IList<复选框>

 公共字符串GetSelectedTextAsCsv()
    {
        VAR缓冲区=新的StringBuilder();
        的foreach(在SelectedCheckBoxes变种CB)
        {
            buffer.Append(cb.Text).Append(,);
        }
        返回DropLastComma(buffer.ToString());
    }

    公共字符串GetTagAsCsv()
    {
        VAR缓冲区=新的StringBuilder();
        的foreach(在SelectedCheckBoxes变种CB)
        {
            buffer.Append(cb.Tag).Append(,);
        }
        返回DropLastComma(buffer.ToString());
    }
 

我试图提取方法,该方法返回一个 Func键< T,TResult> ,但不知道我怎么能拉的了。 我可怜的尝试是像下面,但我无法弄清楚如何提取属性部分的内显示在注释ConvertToCsv()

 公共Func键< T,字符串> ConvertToCsv< T>()
    {
        返回参数propertyName =>
        {
            VAR缓冲区=新的StringBuilder();
            的foreach(在SelectedCheckBoxes VAR复选框)
            {
                buffer.Append(
                    / *你怎么能提取这部分?就像下面? * /
                    checkBox.propertyName
                )。附加(,);
            }
            返回DropLastComma(buffer.ToString());
        };
    }
 

如果我是一个错误的轨道上,请你告诉我,我怎么可以重构上面的code使用的常用方法?

[更新1] 以下是双方Brian和乔恩的答案的组合

 公共字符串ConvertToCsv< T>(Func键<复选框,T>的getValue)
    {
        VAR stringValues​​ = SelectedCheckBoxes.Select(
            CB => 。的getValue(CB)的ToString())的ToArray();
        返回的string.join(,,stringValues​​);
    }

    公共字符串GetSelectedTextAsCsv()
    {
        返回ConvertToCsv(CB => cb.Text);
    }

    公共字符串GetTagAsCsv()
    {
        返回ConvertToCsv(CB => cb.Tag);
    }
 
从单一功能到生态组合,阿里如何重构 会员

[更新2] 版本2

 公共字符串GetAsCsv< T>(Func键<复选框,T>的getValue)
    {
        返回的string.join(,,SelectedCheckBoxes.Select(
            CB =>的getValue(CB)的ToString())的ToArray())。
    }

    公共字符串GetSelectedTextAsCsv()
    {
        返回GetAsCsv(CB => cb.Text);
    }

    公共字符串GetTagAsCsv()
    {
        返回GetAsCsv(CB =>
            cb.Tag == NULL?的String.Empty:cb.Tag.ToString());
    }
 

[更新3] 制成 GetAsCsv()作为一个封闭的通用CheckBox和的参数字符串

  

Func键<复选框,T> Func键<复选框,串>

这让我做出 GetAsCsv()更简单和更具可读性。

 私人字符串GetAsCsv(Func键<复选框,串>的getValue)
{
    返回的string.join(,,SelectedCheckBoxes.Select(的getValue).ToArray());
}
 

解决方案

 公共字符串GetAsCsv(Func键<复选框,串>的getValue)
{
    VAR缓冲区=新的StringBuilder();
    的foreach(在SelectedCheckBoxes变种CB)
    {
        。buffer.Append(的getValue(CB))追加(,);
    }
    返回DropLastComma(buffer.ToString());
}
 

然后:

  GetAsCsv(CB => cb.Tag = NULL cb.Tag.ToString():?的String.Empty);
GetAsCsv(CB => cb.Text);
 

I have two methods that basically converts underlying checkboxes' text or tag as CSV strings.

These two methods

GetSelectedTextAsCsv() GetTagAsCsv()

differ only by which property to extract value from SelectedCheckBoxes, which is of type 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());
    }

I was trying to extract a method that returns a Func<T, TResult> but not sure how I can pull that off. My poor attempt was like the following but I cannot figure out how to extract the property portion as shown in the comment within 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());
        };
    }

If I am on a wrong track, would you please advise me on how I can refactor above code to use a common method?

[UPDATE 1] Here is the combination of both Brian and Jon's answers

    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);
    }

[UPDATE 2] version 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] Made the parameter of GetAsCsv() as a closed generic of CheckBox and string

Func<CheckBox, T> to Func<CheckBox, string>.

That allowed me to make GetAsCsv() even simpler and more readable.

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());
}

Then:

GetAsCsv(cb => cb.Tag != null ? cb.Tag.ToString() : string.Empty);
GetAsCsv(cb => cb.Text);

 
精彩推荐
图片推荐