Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并具有多个列表但长度不同的相等项_C#_Linq - Fatal编程技术网

C# 合并具有多个列表但长度不同的相等项

C# 合并具有多个列表但长度不同的相等项,c#,linq,C#,Linq,我有两张清单 它们的长度不同,但类型相同 我希望列表2中的一个项替换列表1中的一个相等项 var item1 = new Item { Id = 1, Name = "Test1" }; var item2 = new Item { Id = 2, Name = "Test2" }; var item3 = new Item { Id = 3, Name = "Test3" }; var item4 = new Item { Id = 4, Name = "Test4" }; var item5

我有两张清单

它们的长度不同,但类型相同

我希望列表2中的一个项替换列表1中的一个相等项

var item1 = new Item { Id = 1, Name = "Test1" };
var item2 = new Item { Id = 2, Name = "Test2" };
var item3 = new Item { Id = 3, Name = "Test3" };
var item4 = new Item { Id = 4, Name = "Test4" };
var item5 = new Item { Id = 5, Name = "Test5" };

var list1 = new List<Item> { item1, item2, item3, item4, item5 };
var list2 = new List<Item> { new Item { Id = 1, Name = "NewValue" } };
var item1=newitem{Id=1,Name=“Test1”};
var item2=新项{Id=2,Name=“Test2”};
var item3=新项{Id=3,Name=“Test3”};
var item4=新项{Id=4,Name=“Test4”};
var item5=新项{Id=5,Name=“Test5”};
var list1=新列表{item1,item2,item3,item4,item5};
var list2=新列表{new Item{Id=1,Name=“NewValue”};
因此,我希望列表中有5个项,其中Id=1的项的值为“NewValue”

我怎样才能在linq身上做到这一点

更新

我的问题是:


如何在不手动复制所有属性的情况下替换替换的项。想象一下我有100个属性…

这是一种方法:

首先定义一个仅依赖于
类的
Id
属性的相等比较器,如下所示:

public class IdBasedItemEqualityComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Item obj)
    {
        return obj.Id.GetHashCode();
    }
}
var result = list1.Except(list2, new IdBasedItemEqualityComparer()).Concat(list2).ToList();
    List<Item> newItems =
        (from l1 in list1
         join l2 in list2 on l1.Id equals l2.Id into l12
         from l2 in l12.DefaultIfEmpty()
         select new { Item = (l2 == null) ? l1 : l2 }).Select(r => r.Item).ToList();

请注意,我是如何将
IDBasedItemQualityComparer
Exception
方法一起使用的,这样比较就只基于
Id

这是一种解决方案

var list3 = new List<Item>();    

foreach (var item in list1)   
   list3.Add(list2.FirstOrDefault(s => s.Id == item.Id) ?? item);
var list3=新列表();
foreach(列表1中的变量项)
list3.Add(list2.FirstOrDefault(s=>s.Id==item.Id)??item);

我认为Linq中的LEFT-OUTER-JOIN将能够合并两个列表,而不考虑属性(列)的数量,如下所示:

public class IdBasedItemEqualityComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Item obj)
    {
        return obj.Id.GetHashCode();
    }
}
var result = list1.Except(list2, new IdBasedItemEqualityComparer()).Concat(list2).ToList();
    List<Item> newItems =
        (from l1 in list1
         join l2 in list2 on l1.Id equals l2.Id into l12
         from l2 in l12.DefaultIfEmpty()
         select new { Item = (l2 == null) ? l1 : l2 }).Select(r => r.Item).ToList();
列出新项目=
(来自列表1中的l1)
将l1.Id等于l2.Id的列表2中的l2连接到l12
从l12.DefaultIfEmpty()中的l2
选择新的{Item=(l2==null)?l1:l2});

在谷歌上搜索,你会看到大量的结果/示例。这里有一个给你。。我更新了我的问题。我用过谷歌,但我找不到你的链接-这对我只有部分帮助-你说你找不到这个链接是什么意思?就在这里,你需要原始列表中的任何属性值吗?我的意思是我没有在谷歌中找到你的链接。这意味着谷歌搜索结果取决于你使用的关键词。好的,你先做一个RemovedUpplicateItems,然后添加所有项目。