4

我有两个元素集合。我正在尝试获取第一个集合中在第二个集合中具有匹配 ID 的所有元素,并对匹配的元素运行 CopyToDomain 方法。

下面的代码运行良好,但我对它的冗长感到有点惊讶。ReSharper 在这里不推荐任何东西,但我想知道是否对两个集合进行交集,然后将方法映射到元素上会更清楚吗?你会做出改变,还是我应该停止大惊小怪并保持原样?

Task task = new Task();
IList<TaskAttributeDto> taskAttributeDtos = new List<TaskAttributeDto>();
taskAttributeDtos.Add(new TaskAttributeDto{ ID = 1});
taskAttributeDtos.Add(new TaskAttributeDto{ ID = 2});

foreach (TaskAttributeDto taskAttributeDto in taskAttributeDtos)
{
    TaskAttribute matching = task.TaskAttributes.FirstOrDefault(t => t.ID == taskAttributeDto.ID);
    if (matching != null)
    {
        taskAttributeDto.CopyToDomain(matching);
    }
}
4

5 回答 5

11

你所做的基本上是一个连接,所以你可以使用 Linq 连接语法:

var matches =
    from dto in taskAttributesDtos
    join attribute in task.TaskAttributes on dto.ID equals attribute.ID
    select new { dto, attribute};

foreach (var m in matches)
    m.dto.CopyToDomain(m.attribute);
于 2012-12-06T17:52:49.467 回答
2
foreach(TaskAttributeDto taskAttributeDto in taskAttributeDtos.Where(t1 => TaskAttributes .Any(t2 => t2.Id == t1.Id)))
{
    taskAttributeDto.CopyToDomain(taskAttributeDto);
}
于 2012-12-06T18:06:56.600 回答
2

如果您担心查询语法的可读性,可以尝试使用方法语法:

var matches = taskAttributesDtos.Join(task.TaskAttributes,
                                      a => a.ID,
                                      b => b.ID,
                                      (a, b) => new { dto = a, attribute = b } );

foreach (var m in matches)
    m.dto.CopyToDomain(m.attribute);
于 2012-12-06T18:58:19.160 回答
1
task.TaskAttributes.Where(t => taskAttributeDtos.Select(d => d.ID).Contains(t.ID))
    .ToList()
    .ForEach(t => taskAttributeDtos.First(d => d.ID == t.ID).CopyToDomain(t));
于 2012-12-06T17:52:20.177 回答
0

原始代码找到第一个匹配项。加入会查找所有匹配项,组加入允许您从每个匹配组中选择获胜者。

var matches =
    from dto in taskAttributesDtos
    join attribute in task.TaskAttributes
      on dto.ID equals attribute.ID
      into attributeGroup  //into clause causes GroupJoin to be called.
    select new { dto, attribute = attributeGroup.First() };

foreach (var m in matches)
    m.dto.CopyToDomain(m.attribute);
于 2012-12-07T03:17:04.433 回答