我有2个相同类型的列表。
清单1:
1,“Prod1”,0
2,“Prod2”,50
3,“Prod3”,0
清单2:
1,“Prod1”,25
2,“Prod2”,100
3,“Prod3”,75
我需要将这两个列表合并为1,但如果list1 == 0
中的相应值,我只需要list2中的值所以我的新列表应如下所示:
1,“Prod1”,25
2,“Prod2”,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
这样做的最佳方式是什么?
答案 0 :(得分:3)
您只需选择单个属性,并有条件地从第一个或第二个列表项中选择Value
。
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是唯一的Name
来自List1
List2
即使在ax.plot_date()
中有所不同,也是您想要的。
答案 1 :(得分:1)
克隆l1和
foreach (var item in l1Clone)
if (item.value == 0)
item.value == l2.FirstOrDefault(l2item => l2item.ID == item.ID)
答案 2 :(得分:1)
请参阅以下代码:
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
});
}
答案 3 :(得分:1)
您可以使用Zip:
var combined = list1
.Zip(list2, (product1, product2) => product1.Value == 0 ? product2 : product1);