你可以重构了这两个方法的一个共同的功能? [英] Can you refactor out a common functionality from these two methods?

查看:186
本文介绍了你可以重构了这两个方法的一个共同的功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个方法,基本上皈依基本复选框的文字或标记为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);

这篇关于你可以重构了这两个方法的一个共同的功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆