4

要素のコレクションが 2 つあります。2 番目のコレクションで一致する ID を持つ最初のコレクションのすべての要素を取得し、一致する要素に対して CopyToDomain メソッドを実行しようとしています。

次のコードは問題なく動作しますが、その冗長さに少し驚きました。ReSharper はここでは何も推奨していませんが、2 つのコレクションを交差させてから、メソッドを要素にマッピングする方がより明確になるのではないかと考えていました。あなたはその変更を行いますか、それとも私が大騒ぎするのをやめて、このままにしておくべきですか?

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

クエリ構文の読みやすさが気になる場合は、メソッド構文を使用してみてください。

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 に答える
2
foreach(TaskAttributeDto taskAttributeDto in taskAttributeDtos.Where(t1 => TaskAttributes .Any(t2 => t2.Id == t1.Id)))
{
    taskAttributeDto.CopyToDomain(taskAttributeDto);
}
于 2012-12-06T18:06:56.600 に答える
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 に答える