C# 在方法中使用lambda并与列表匹配

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

我有以下代码用于为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: [");
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("]}");