C# 在方法中使用lambda并与列表匹配
我有以下代码用于为jquery图生成数据。然而,它是相当重复的,为了保持干燥,我想通过引入一种方法来重构C# 在方法中使用lambda并与列表匹配,c#,lambda,expression-trees,C#,Lambda,Expression Trees,我有以下代码用于为jquery图生成数据。然而,它是相当重复的,为了保持干燥,我想通过引入一种方法来重构 sb.Append("{name: 'Pull Ups', data: ["); foreach(var item in data) { sb.Append(prefix); prefix = ","; sb.Append(item.PullUps); } sb.Append("]}"); sb.Append("{name: 'Push Ups', data: ["); p
sb.Append("{name: 'Pull Ups', data: [");
foreach(var item in data)
{
sb.Append(prefix); prefix = ",";
sb.Append(item.PullUps);
}
sb.Append("]}");
sb.Append("{name: 'Push Ups', data: [");
prefix = string.Empty;
foreach (var item in data)
{
sb.Append(prefix); prefix = ",";
sb.Append(item.PushUps);
}
sb.Append("]}");
我需要的方法是
void Data(ref StringBuilder sb, string title, IList<DataDto> data, ...)
然而,我正在努力找出如何做到这一点。我知道我需要使用类似的东西
private static void Data<T, TProp>(ref StringBuilder sb,
IList<T> data, Func<T, TProp> selector)
我的数据非常简单:-
public class DataDto
{
public virtual decimal PullUps { get; set; }
public virtual decimal PushUps { get; set; }
public virtual decimal Squats { get; set; }
...
}
我想,你想要这样的东西:
void YourMethod<TItem, TProp>(StringBuilder sb, string name, IList<TItem> data,
Func<TItem, TProp> selector)
{
var prefix = "";
sb.Append("{name: '"+name+"', data: [");
foreach(var item in data)
{
sb.Append(prefix);
prefix = ",";
sb.Append(selector(item).ToString());
}
sb.Append("]}");
}
YourMethod(sb, "Pull Ups", data, d=>d.PullUps);
YourMethod(sb, "Push Ups", data, d=>d.PushUps);
YourMethod(sb, "Squats", data, d=>d.Squats);
简化你的代码怎么样
sb.Append("{name: 'Pull Ups', data: [");
sb.Append(String.Join(",", myExercises.Select(e=>e.PullUps));}
sb.Append("]}");
sb.Append("{name: 'Push Ups', data: [");
sb.Append(String.Join(",", myExercises.Select(e=>e.PushUps));}
sb.Append("]}");
另外,你能做部分引体向上、俯卧撑或蹲起吗?十进制是否有点过分?您是否考虑过有比字符串混搭更好的方法来生成JSON格式的数据?查找JavascriptSerializer.+1@Jamiec,我甚至没有注意到他在构建JSON,直到你指出它。@Jamiec-你是对的,谢谢你,我只是自己注意到了这一点!不过,对我的问题的回答将在将来对我有所帮助。我喜欢这一点的简单性,但我在一些选择中也有一些业务逻辑,因此提取到一个方法更可取。然而,a+1很适合我代码中的其他地方。之所以它是十进制的,是因为它是相对于全国平均水平的一个百分比,而不是一个人能做的俯卧撑的数量。
YourMethod(sb, "Pull Ups", data, d=>d.PullUps);
YourMethod(sb, "Push Ups", data, d=>d.PushUps);
YourMethod(sb, "Squats", data, d=>d.Squats);
sb.Append("{name: 'Pull Ups', data: [");
sb.Append(String.Join(",", myExercises.Select(e=>e.PullUps));}
sb.Append("]}");
sb.Append("{name: 'Push Ups', data: [");
sb.Append(String.Join(",", myExercises.Select(e=>e.PushUps));}
sb.Append("]}");