在方法内使用lambda并匹配List

时间:2011-05-25 12:04:14

标签: c# lambda expression-trees

我有以下代码用于为jquery图生成数据。然而,它是非常重复的,为了保持DRY,我想通过引入一种方法来重构。

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,  ...)

我希望我的代码类似于: -

Data(ref sb, "Pull Ups", data, d=>d.PullUps);
Data(ref sb, "Push Ups", data, d=>d.PushUps);
Data(ref sb, "Squats", data, d=>d.Squats);

然而,我正在努力寻找如何做到这一点。我知道我需要使用与

类似的东西
private static void Data<T, TProp>(ref StringBuilder sb, 
   IList<T> data, Func<T, TProp> selector)

和里面(pusedocode)

foreach(var item in data) {
  if (selector == ???)
   sb.Append(??);
}

我的DataDto很简单: -

public class DataDto
{
    public virtual decimal PullUps { get;  set; }
    public virtual decimal PushUps { get;  set; }
    public virtual decimal Squats { get;  set; }
 ...
}

2 个答案:

答案 0 :(得分:3)

我想,你想要这样的东西:

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

答案 1 :(得分:2)

如何简化您的代码呢?

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

另外,你可以进行分次上拉,俯卧撑或深蹲吗?十进制有点矫枉过正吗?