Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq是否使用另一个集合中的值更新集合?_C#_Linq_Collections - Fatal编程技术网

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;});