你可以重构了这两个方法的一个共同的功能? [英] Can you refactor out a common functionality from these two methods?
问题描述
我有两个方法,基本上皈依基本复选框的文字或标记为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>
toFunc<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屋!