C# 使用逻辑将2个列表合并为1
我有两个相同类型的列表 清单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
- 身份证
- 名字
- 价值观
2,“产品2”,50
3,“产品3”,0 清单2:
- 身份证
- 名字
- 价值观
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”,252,“产品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.值