Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何比较具有多个对象的两个列表并设置值?_C#_Linq_List - Fatal编程技术网

C# 如何比较具有多个对象的两个列表并设置值?

C# 如何比较具有多个对象的两个列表并设置值?,c#,linq,list,C#,Linq,List,我有两张单子。每个列表都有一个名称对象和一个值对象。我想循环查看list1并检查每个list1 Name对象是否与list2name对象相同(下面的linq代码就是这样做的) 如果它们匹配,那么我希望将List1值设置为list2值如何实现 list1 list2 Name Value Name Value john apple John orange peter null Peter grape 我需要

我有两张单子。每个列表都有一个
名称
对象和一个
对象。我想循环查看
list1
并检查每个
list1 Name
对象是否与
list2name
对象相同(下面的linq代码就是这样做的)

如果它们匹配,那么我希望将
List1值
设置为
list2值
如何实现

list1              list2
Name    Value      Name    Value
john    apple      John    orange
peter   null       Peter   grape
我需要它看起来像这样:

list1              list2
Name    Value      Name    Value
john    orange     john    orange
peter   grape      peter   grape
Linq代码:

var x = list1.Where(n => list2.Select(n1 => n1.Name).Contains(n.Name));

在一个结果中,可以将对象连接在一起:

var output= from l1 in list1
        join l2 in list2
        on l1.Name equals l2.Name
        select new { List1 = l1, List2 = l2};
然后操作返回结果上的对象。通过循环每个和设置:

foreach (var result in output)
  result.List1.Value = result.List2.Value;

对于过滤,您可以使用
LINQ
,使用循环设置值:

var commonItems = from x in list1
                  join y in list2
                  on x.Name equals y.Name
                  select new { Item = x, NewValue = y.Value };

foreach(var x in commonItems)
{
     x.Item.Value = x.NewValue;
}

您正在寻找左连接

var x = from l1 in list1
        join l2 in list2 on l1.Name equals l2.Name into l3
        from l2 in l3.DefaultIfEmpty()
        select new { Name = l1.Name, Value = (l2 == null ? l1.Value : l2.Value) };

选择{Item=x,NewValue=y.Value}行不工作
x
y
找不到您在
选择
@BenScotch之后缺少
new
:您可以从列表1中的x向linq查询
的第一部分添加
where
子句。其中(item=>regex.IsMatch(item.Value))在列表2中加入y…
您只需在查询之前设置正则表达式,并在最后运行foreach(在这个答案中已经是这样了)。(我知道你现在已经删除了问题的正则表达式部分以及此答案中的注释,但如果你仍然觉得有用,我会留下此注释)。@JasonDown我在这里重新编写了问题:正则表达式匹配要求消失了?@IgorPashchuk:他在没有人回答后删除了它。我在被接受的答案上添加了一条评论,就在他删除它之前,但我认为我太晚了,他没有注意到。@IgorPashchuk我删除了它,因为我需要改写这个问题。我可以在几分钟内把它放回去minutes@IgorPashchuk我将问题重新改写如下: