首先通过创建一个名为 LinqExtensions 的类来扩展 Linq,使其具有 Each 选项。
public static class LinqExtensions
{
public static void Each<T>(this IEnumerable<T> source, Action<T> method)
{
foreach (var item in source)
{
method(item);
}
}
}
然后您可以使用 Join 返回一个新对象列表,其中包含具有适当值的原始对象。 Each 将遍历它们,允许您将值作为参数分配或传递给每个对象。
作业示例:
objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}).Each(o=>o.a.SomeProperty=o.AValueIWant);
参数传递示例:
objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}).Each(o=>o.a.SomeMethod(o.AValueIWant));
这样做的好处是 ObjectA 和 ObjectB 不必是同一类型。我已经使用加入字典的对象列表(如查找)来完成此操作。坏事是不清楚发生了什么。你最好跳过 Each 扩展并这样写。
foreach(var change in objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}))
{
change.a.SomeProperty = change.AValueIWant;
change.a.SomeMethod(change.AValueIWant);
}
但为了更清楚,我可能会这样做:
foreach(var update in objectA.Join(objectB,objectA=>objectA.Id,objectB=>objectB.Id,(objectA,objectB) => new {objectA, Value = objectB.AValueIWant}))
{
update.objectA.SomeProperty = update.Value;
}
您将需要在新对象中返回整个 ObjectA,因为它将是只读的,并且这样做的唯一原因是因为引用了集合中的对象,从而允许您更改对象的属性。
但最后最清楚的是跳过所有的 LINQ 连接,只循环遍历集合并查找匹配项,这将有助于未来的维护。 LINQ 很棒,但就像当你有一把锤子时,它不会把所有东西都变成钉子一样,当你有一个集合时,它并不意味着 LINQ 就是答案。