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只更新了值,而不是所有更新的值。我更新了我的答案库