Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 - Fatal编程技术网

C# 使用LINQ将一个对象列表属性更新为另一个列表

C# 使用LINQ将一个对象列表属性更新为另一个列表,c#,linq,C#,Linq,我有一个想象中的情景 class a { String Username; String val; } List<a> lst = new List<a>(); List<a> lstnew = new List<a>(); a类 { 字符串用户名; 字符串val; } List lst=新列表(); List lstnew=新列表(); 我需要的是,在lstnew中,我在val属性中有一些更新的值(仅在几个对象中),我需要

我有一个想象中的情景

class a 
{
  String Username;
  String val;
}


 List<a> lst = new List<a>();

 List<a> lstnew = new List<a>();
a类
{
字符串用户名;
字符串val;
}
List lst=新列表();
List lstnew=新列表();

我需要的是,在
lstnew
中,我在
val
属性中有一些更新的值(仅在几个对象中),我需要用
lstnew
中的更新值更新
lst
,作为
Username
属性,使用LINQ

听起来您有两个列表。其中一个名为
lst
并包含完整的用户名列表,另一个名为
lstnew
并包含更新了
val
属性的用户名列表。我建议将未更改的用户名与已更新的用户名合并。这是我能想到的最有利于LINQ的解决方案

var updatedList = Enumerable.Union(
    lst.Where(x => !lstnew.Any(y => y.Username == x.Username)),
    lstnew).ToList();

听起来你好像有两张单子。其中一个名为
lst
并包含完整的用户名列表,另一个名为
lstnew
并包含更新了
val
属性的用户名列表。我建议将未更改的用户名与已更新的用户名合并。这是我能想到的最有利于LINQ的解决方案

var updatedList = Enumerable.Union(
    lst.Where(x => !lstnew.Any(y => y.Username == x.Username)),
    lstnew).ToList();

您应该能够使用该方法执行此操作

lst.Zip(lstNew, (orig, new) => {
    orig.Username = new.Username;
    return orig;
});

将每一对放在一起,然后更改
原始用户名
值并返回
原始用户名

,而不是返回一个新的,您应该能够使用该方法执行此操作

lst.Zip(lstNew, (orig, new) => {
    orig.Username = new.Username;
    return orig;
});

将每一对放在一起,然后更改
orig.Username
值并返回
orig

,而不是返回一个新的一对,这也应该起到作用<由Alastair Pitts提出的code>Zip方法假设两个集合的元素顺序相同,并且第一个列表中的每个元素在第二个列表中都有对应的元素。我的方法更通用,它只是通过比较
Username
属性来查找相应的元素。它仍然假设对于
lstNew
中的每个元素,在
lst
中都有相应的元素

lstNew.ForEach(new => lst.First(orig => orig.Username == new.Username).val = new.val);

这也应该起到作用<由Alastair Pitts提出的code>Zip方法假设两个集合的元素顺序相同,并且第一个列表中的每个元素在第二个列表中都有对应的元素。我的方法更通用,它只是通过比较
Username
属性来查找相应的元素。它仍然假设对于
lstNew
中的每个元素,在
lst
中都有相应的元素

lstNew.ForEach(new => lst.First(orig => orig.Username == new.Username).val = new.val);

您可以将
UserName
上的两个列表合并,然后用第二个列表中的值更新第一个列表中的

例如,给定此类和列表:

public class a
{
    public string UserName { get; set; }
    public string Value { get; set; }
}

List<a> list = new List<a>
{
    new a { UserName = "Perry", Value = "A" },
    new a { UserName = "Ferb", Value = "B" },
    new a { UserName = "Phineas", Value = "C" }
};

List<a> newList = new List<a>
{
    new a { UserName = "Phineas", Value = "X" },
    new a { UserName = "Ferb", Value = "Y" },
    new a { UserName = "Candace", Value = "Z" }
};
此时,如果我理解正确,您希望更新原始列表中的元素:

foreach(var c in common)
{
    c.A1.Value = c.A2.Value;
}
此时
列表中的元素如下所示:

UserName    Value
-----------------
Perry       A
Ferb        Y
Phineas     X

您可以将
UserName
上的两个列表合并,然后用第二个列表中的值更新第一个列表中的

例如,给定此类和列表:

public class a
{
    public string UserName { get; set; }
    public string Value { get; set; }
}

List<a> list = new List<a>
{
    new a { UserName = "Perry", Value = "A" },
    new a { UserName = "Ferb", Value = "B" },
    new a { UserName = "Phineas", Value = "C" }
};

List<a> newList = new List<a>
{
    new a { UserName = "Phineas", Value = "X" },
    new a { UserName = "Ferb", Value = "Y" },
    new a { UserName = "Candace", Value = "Z" }
};
此时,如果我理解正确,您希望更新原始列表中的元素:

foreach(var c in common)
{
    c.A1.Value = c.A2.Value;
}
此时
列表中的元素如下所示:

UserName    Value
-----------------
Perry       A
Ferb        Y
Phineas     X

我知道这是一个老问题,但我已经开发了一个更优雅的解决方案,它比@JeffOgata给出的解决方案稍有改进:

var newList= lst.GroupJoin(lstnew ,
                i => i.UserName ,
                j => j.UserName ,
                (i, j) => j.FirstOrDefault()?? i );
其中,
lst
是原始列表,
lstnew
是新列表

这只会将第一个列表中的整个对象替换为第二个列表中的相应对象(连接)(如果存在)。 这比@JeffOgata给出的答案稍有改进

结果是一样的

如果您有复杂的对象,那么遍历每个对象,然后遍历所有属性都是一个问题,简单地用新对象替换旧对象会更快


我知道这是一个老问题,但我已经开发了一个更优雅的解决方案,它比@JeffOgata给出的解决方案稍有改进:

var newList= lst.GroupJoin(lstnew ,
                i => i.UserName ,
                j => j.UserName ,
                (i, j) => j.FirstOrDefault()?? i );
其中,
lst
是原始列表,
lstnew
是新列表

这只会将第一个列表中的整个对象替换为第二个列表中的相应对象(连接)(如果存在)。 这比@JeffOgata给出的答案稍有改进

结果是一样的

如果您有复杂的对象,那么遍历每个对象,然后遍历所有属性都是一个问题,简单地用新对象替换旧对象会更快


这可能会对某人有所帮助。

也许我只是累了,但我一个字也听不懂你的问题。这就像
List
List
有没有和
List
一样,对于
一些
用户名,List有相同的
Val
。。我需要将
List
中的这些不同的
Val
设置为
List
也许我只是累了,但我一个字都听不懂你的问题。就像
List
List
有没有和
List
一样,对于
一些
用户名,List有相同的
Val
。。我需要在
List
中将这些不同的
Val
设置为
List
它与
List
List
类似,并且
List
和List都有相同的用户名,但是
Val
对于
一些用户名不同。。我需要在
List
中将这些不同的
Val
设置为
List
为什么不直接复制列表呢
var lstnew=lst.ToList()
List只更新了值,而不是所有更新的值。我更新了我的答案库