C# Linq是否使用另一个集合中的值更新集合?
我有C# Linq是否使用另一个集合中的值更新集合?,c#,linq,collections,C#,Linq,Collections,我有IQueryablebaseList 和ListsomeData 我想做的是更新baseList中某些项的属性 对于someData中的每个项,我希望在baselist中找到相应的项,并更新该项的属性 someOtherClass.someCode==baseList.myCode 我是否可以使用Linq执行某种类型的联接,并将baseList.someData+=someOtherClass.DataIwantToConcatenate设置为 我可能可以通过迭代来实现这一点,但有没有一种奇
IQueryable
baseList
和List
someData
我想做的是更新baseList中某些项的属性
对于someData中的每个项,我希望在baselist中找到相应的项,并更新该项的属性
someOtherClass.someCode==baseList.myCode
我是否可以使用Linq执行某种类型的联接,并将baseList.someData+=someOtherClass.DataIwantToConcatenate设置为
我可能可以通过迭代来实现这一点,但有没有一种奇特的Linq方法可以在几行代码中实现这一点
谢谢你的提示,
~ck位于圣地亚哥LINQ用于查询,而不是更新。这意味着可以使用LINQ查找相应的项,但是对于修改,应该使用迭代
诚然,您可能需要先执行一些适当的查询,以将
基本列表
转换为一种有效的形式,例如,基于要用于查找相应项的属性的词典。您可以将IQueryable
转换为列表
,使用ForEach
方法在其上循环并更新元素,然后转换回IQueryable
:
List<SomeClass> convertedList = baseList.ToList();
convertedList.ForEach(sc =>
{
SomeOtherClass oc = someData.First(obj => obj.SomeCode == sc.MyCode);
if (oc != null)
{
sc.SomeData += oc.DataIWantToConcatenate;
}
});
baseList = convertedList.AsQueryable(); // back to IQueryable
List convertedList=baseList.ToList();
convertedList.ForEach(sc=>
{
SomeOtherClass oc=someData.First(obj=>obj.SomeCode==sc.MyCode);
如果(oc!=null)
{
sc.SomeData+=oc.DataIWantToConcatenate;
}
});
baseList=convertedList.AsQueryable();//返回IQueryable
但在此期间,使用非LINQ构造可能更有效。您不能简单地找到一个列表中的对象,而不是另一个列表中的对象,因为它们是两种不同的类型。我假设您正在比较一个名为OtherProperty的属性,该属性对于两个不同的类是公共的,并且共享相同的类型。在这种情况下,只使用Linq查询:
// update those items that match by creating a new item with an
// updated property
var updated =
from d in data
join b in baseList on d.OtherProperty equals b.OtherProperty
select new MyType()
{
PropertyToUpdate = d.PropertyToUpdate,
OtherProperty = d.OtherProperty
};
// and now add to that all the items in baseList that weren't found in data
var result =
(from b in baseList
where !updated.Select(x => x.OtherProperty).Contains(b.OtherProperty)
select b).Concat(updated);
要将两个列表中的元素配对,可以使用LINQ联接:
var pairs = from d in someData
join b in baseList.AsEnumerable()
on d.someCode equals b.myCode
select new { b, d };
这将为您提供someData
中每个项目的枚举,并与基本列表中的对应项配对。从此处,您可以在循环中连接:
foreach(var pair in pairs)
pair.b.SomeData += pair.d.DataIWantToConcantenate;
如果您真正的意思是设置连接而不是+=
,那么请看一下LINQ的并集、交集或Except方法。如前所述,它应该是loop和LINQ的组合
foreach (var someDataItem in someData)
{
someDataItem.PropertyToUpdate = (baseList.FirstOrDefault(baseListItem => baseListItem .key == someDataItem.key) ?? new SomeClass(){OtherProperty = "OptionalDefaultValue"}).OtherProperty;
}
在这种方法和公认的方法之间进行交叉是否可行,例如(从someData中的d连接baseList中的b.AsEnumerable()在d.someCode上等于b.myCode选择新的{b,d}).ToList.ForEach(a=>{a.b.someData+=a.d.DataIWantToConcatenate;});