我有一个带有一些属性的列表:
public class Class1
{
public int Id;
public string Name;
}
List<Class1> list1 = GetSomeData()
在这个步骤之后,我已经填写了列表1中的所有Id,但名称为空。我还有第二个列表,其中填充了这样的值:
public class Class2
{
public int Id;
public string Name;
}
List<Class2> list2 = GetSomeData()
所以list2已经填充了Id和Names-Id与list1相同,但当然是在其他索引上。
是否可以根据Id到linq,用list2中的name填充list1中的属性名称?我试过这样的东西,但不起作用。我只能将Names添加到数组或(新)列表中,但不能添加到list1中。
list1.Join(list2,
l2 => l2.Id,
l1 => l1.Id,
(l1, l2) => { l1.Name = l2.Name; return l1.Name; });
或者这个-但新条款有问题,所以我无法再次将其保存到列表1中。
(from l1 in list1
join l2 in list2
on l1.Id equals l2.Id
select new { l1.Name = l2.Name });
感谢的帮助
您的方法是可行的,但请注意,枚举值是惰性求值的。您的代码设置了一个可枚举序列,但实际上并没有遍历枚举——因此,setter永远不会被调用。
强制枚举的一种方法是在语句末尾添加ToList()
:
list1.Join(list2,
l2 => l2.Id,
l1 => l1.Id,
(l1, l2) => { l1.Name = l2.Name; return l1.Name; })
.ToList();
这似乎有违直觉,但您的方法也有点非正统——通常这样更改枚举块内的属性可能是不明智的。我认为使用ForEach
迭代器来设置属性会更好(更清晰、更安全,即使有点冗长):
list1.Join(list2,
l2 => l2.Id,
l1 => l1.Id,
(l1, l2) => new { l1 = l1, l2 = l2 })
.ToList()
.ForEach(x => {
x.l1.Name = x.l2.Name;
});