使用逻辑

时间:2016-05-24 14:49:59

标签: c# linq

我有2个相同类型的列表。

清单1:

  • ID
  • 名称
  

1,“Prod1”,0
  2,“Prod2”,50
  3,“Prod3”,0

清单2:

  • ID
  • 名称
  

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

的变体

这样做的最佳方式是什么?

4 个答案:

答案 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);