[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条记录。
答案 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,那么上述内容将无济于事 - 您必须重新设计并更多/不同地分离关注点。