linq 如何通过一个唯一的字段值合并两个列表,并使用一个列表中的值填充空字段?

kyxcudwk  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(133)

如何通过唯一字段值合并两个列表并使用值填充空字段 名单上的一个?
我有一个类,其中唯一字段是Model_id:

class Structure
    {
        public string Category { get; set; }
        public string Place { get; set; }
        public string Model_id { get; set; }    
        public string Link { get; set; }
    }

两个完整的列表:

List<Structure> list1 = new List<Structure>()
  {
   new  Structure{  Category="nwctrinity",Place ="",Model_id ="00001q", Link ="long_link1"},
   new  Structure{  Category="nwczion",Place ="",Model_id ="00002q",Link ="long_link2"}
  };

List<Structure> list2 = new List<Structure>()
  {
   new  Structure{  Category="",Place ="nebuchadnezzar",Model_id ="00001q", Link =""},
   new  Structure{  Category="",Place ="earth",Model_id ="00002q",Link =""},
   new  Structure{  Category="",Place ="space",Model_id ="00034q",Link =""}
  };

这两个列表都有数百万条条目。正如我们所看到的,两个列表都有相同的条目,具有相同的Model_id,list2的条目比list1多,并且两个列表中的某些字段都没有填充。需要得到这样的列表:

List<Structure> list3 = new List<Structure>()
  {
  new  Structure{  Category="nwctrinity",Place ="nebuchadnezzar",Model_id ="00001q", Link ="long_link1"},
  new  Structure{  Category="nwczion",Place ="earth",Model_id ="00002q",Link ="long_link2"},
  new  Structure{  Category="",Place ="space",Model_id ="00034q",Link =""}
  };

好的,如果你通过一个for循环来做这个,那么处理过程需要两个多小时。

List<Structure> list3 = new List<Structure>();
   for (int i = 0; i < list2.Count; i++)
       {
        int index = list1.FindIndex(a => a.Model_id == list2[i].Model_id);
        if (index != -1)
          {
           list3.Add(new Structure { Category = list1[index].Category, Model_id = structure[i].Model_id, Place = structure[i].Place, Link = list1[index].Link });
          }
        else list3.Add(list2[i]);
       }

我尝试使用LINQ,但我得到的结果列表没有来自list2的空字段值的记录:

var invar = (from a in list2
                        join b in list1
                        on a.Model_id equals b.Model_id
                        select new
                          {
                           a.Model_id,
                           a.Place,
                           b.Category,
                           b.Link });
ubof19bj

ubof19bj1#

要合并两个列表并使用其中一个列表中的值填充空字段,可以使用LINQ的Join操作,然后选择所需的字段以创建新列表。

var list3 = (from a in list2
             join b in list1 on a.Model_id equals b.Model_id into temp
             from b in temp.DefaultIfEmpty()
             select new Structure
             {
                 Category = b?.Category ?? a.Category,
                 Place = b?.Place ?? a.Place,
                 Model_id = a.Model_id,
                 Link = b?.Link ?? a.Link
             }).ToList();

相关问题