3
[WebMethod(Description = "Return all activities by Task.")]
public IList<ActivityDto> GetActivitiesByTaskID(int taskID)
{
    IList<Activity> activities = ActivityDao.GetByTaskID(taskID);
    IList<ActivityDto> activityDtos = new List<ActivityDto>(activities.Count);

    foreach(Activity activity in activities)
        activityDtos.Add(ActivityDto.Create(activity));

    return activityDtos;
}

缩短为:

[WebMethod(Description = "Return all activities by Task.")]
public IList<ActivityDto> GetActivitiesByTaskID(int taskID)
{
    return ActivityDao.GetByTaskID(taskID).Select(ActivityDto.Create).ToList();
}

我觉得因为我不得不问 - 它可能做得有点太多了。不过,唯一让我担心的部分是将函数传递给 Select 语句。不过,我认为我只是没有足够地使用这种语法,而且它实际上是一种非常简洁的表达方式。

我想知道其他程序员看到这种方法的缩短版本是否会感到不安。

编辑:另外,对效率比较的评论将不胜感激。我知道 LINQ 因在大型数据集上运行速度较慢而臭名昭著。我想说在某些情况下可以枚举 10,000-20,000 条记录。

4

2 回答 2

10

不,它是富有表现力和简洁的。

第一个版本是关于如何迭代列表和转换元素。

第二个版本是关于结果应该是什么。

创建 LINQ 的目的是为我们提供强大的、可读的工具来处理和转换集合。这正是您在第二个示例中使用它的目的。

对于不熟悉方法组语法的人,另一种选择可能是使用查询表达式:

var result = from task in ActivityDao.GetByTaskID(taskID)
             select ActivityDto.Create(task);
return result.ToList(); // if you really need it as a list
于 2012-09-06T17:28:32.157 回答
1

对于它的价值,该行相当于:

var activity =  ActivityDao.GetByTaskID(taskID);
var q = activity.Select(ActivityDto.Create);
return q.ToList();

如果您认为 R# 将其改写为更具可读性,您可以执行上述操作。如果您担心的是违反得墨忒耳法则,那么上述内容不会有太大帮助——您必须重新设计和更多/不同地分离关注点。

于 2012-09-06T17:36:30.757 回答