Resharper重新设计了for循环。这条LINQ语句在一行中做得太多了吗?

时间:2012-09-06 17:21:14

标签: c# .net linq refactoring resharper

[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条记录。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

如果您认为R#重新设计它可以更具可读性,那么可以执行上述操作。如果您关注的是违反Law of Demeter,那么上述内容将无济于事 - 您必须重新设计并更多/不同地分离关注点。