C# 使用逻辑将2个列表合并为1

C# 使用逻辑将2个列表合并为1,c#,linq,C#,Linq,我有两个相同类型的列表 清单1: 身份证 名字 价值观 1,“产品1”,0 2,“产品2”,50 3,“产品3”,0 清单2: 身份证 名字 价值观 1,“产品1”,25 2,“产品2”,100 3,“Prod3”,75 我需要将这两个列表合并到1中,但我只需要list2中的值,如果list1中的对应值==0 因此,我的新列表应该如下所示: var joined = from l1 in List1.Where(x=>x.Value == "0") join l2 in List2

我有两个相同类型的列表

清单1:

  • 身份证
  • 名字
  • 价值观
1,“产品1”,0
2,“产品2”,50
3,“产品3”,0

清单2:

  • 身份证
  • 名字
  • 价值观
1,“产品1”,25
2,“产品2”,100
3,“Prod3”,75

我需要将这两个列表合并到1中,但我只需要list2中的值,如果list1中的对应值==0

因此,我的新列表应该如下所示:

var joined = from l1 in List1.Where(x=>x.Value == "0")
join l2 in List2 on l1.ID equals l2.ID into gj
select new { gj };
1,“产品1”,25
2,“产品2”,50
3,“Prod3”,75

我尝试过许多类似的变化:

var joined = from l1 in List1.Where(x=>x.Value == "0")
join l2 in List2 on l1.ID equals l2.ID into gj
select new { gj };
我还尝试了一种变化的
concat


执行此操作的最佳方法是什么?

您只需选择单个属性,然后有条件地从第一个或第二个列表项中选择

var List1 = new[]
            {
                new { Name = "Prod1", Id = 1, Value = 0 },
                new { Name = "Prod2", Id = 2, Value = 50 },
                new { Name = "Prod3", Id = 3, Value = 0 },
                new { Name = "NotInList2", Id = 4, Value = 0}
            };
var List2 = new[]
            {
                new { Name = "Prod1", Id = 1, Value = 25 },
                new { Name = "Prod2", Id = 2, Value = 100 },
                new { Name = "Prod3", Id = 3, Value = 75 }
            };

var results = from l1 in List1
              join l2temp in List2 on l1.Id equals l2temp.Id into grpj
              from l2 in grpj.DefaultIfEmpty()
              select new
              {
                  l1.Id,
                  l1.Name,
                  Value = l1.Value == 0 && l2 != null ? l2.Value : l1.Value
              };

foreach(var item in results)
    Console.WriteLine(item);
将输出

{Id=1,Name=Prod1,Value=25}

{Id=2,Name=Prod2,Value=50}

{Id=3,Name=Prod3,Value=75}

{Id=4,Name=NotInList2,Value=0}

注意:这假设您只需要
List1
中的所有ID(而不是仅在
List2
中的任何ID),并且ID是唯一的,并且来自
List1
名称是您想要的,即使它在
List2
中不同,也可以克隆l1和l1

foreach (var item in l1Clone)
    if (item.value == 0)
        item.value == l2.FirstOrDefault(l2item => l2item.ID == item.ID)

请参阅以下代码:

IEnumerable<item> join_lists(IEnumerable<item> list1, IEnumerable<item> list2)
{
  var map = list2.ToDictionary(i => i.id);
  return list1.Select(i => new item()
  {
    id = i.id,
    name = i.name,
    value = i.value == 0 ? map[i.id].value : i.value
  });
}
IEnumerable联接列表(IEnumerable列表1、IEnumerable列表2)
{
var map=list2.ToDictionary(i=>i.id);
返回列表1.Select(i=>newitem()
{
id=i.id,
name=i.name,
value=i.value==0?映射[i.id]。值:i.value
});
}
您可以使用:


谢谢这就是我需要的。如果列表不同,它会发生什么变化?@webdad3如果您想要列表1中的所有项目,替换列表2中的零值,但是列表1中的一些Id可能不在列表2中,那么您需要在l1上执行左连接
将列表2中的l2a连接起来。Id等于l2a。Id从grpj.DefaultIfEmpty()中的l2连接到grpj
然后只需将条件更改为
Value=l1。Value==0&&l2!=无效的l2.值:l1.值