C# 如何在不重复的情况下合并两个列表?(可能的dup)
我想我的搜索选项范围会很容易找到这个 我希望合并两份清单,不要重复。这是我的黑客尝试C# 如何在不重复的情况下合并两个列表?(可能的dup),c#,linq,C#,Linq,我想我的搜索选项范围会很容易找到这个 我希望合并两份清单,不要重复。这是我的黑客尝试 public class MyClass { public Guid? MyGuid { get; set; } } //..... Guid? dupGuid1 = Guid.NewGuid(); Guid? uniqueGuid1 = Guid.NewGuid(); MyClass x1 = new MyClass { MyGuid = dupGuid1 }; List<MyClass&
public class MyClass
{
public Guid? MyGuid { get; set; }
}
//.....
Guid? dupGuid1 = Guid.NewGuid();
Guid? uniqueGuid1 = Guid.NewGuid();
MyClass x1 = new MyClass { MyGuid = dupGuid1 };
List<MyClass> myMainList = new List<MyClass>() { x1 };
MyClass y1 = new MyClass { MyGuid = dupGuid1 };
MyClass y2 = new MyClass { MyGuid = uniqueGuid1 };
List<MyClass> myAddList = new List<MyClass> { y1, y2 };
myMainList.AddRange(myAddList
.Where(w => w.MyGuid != myAddList.SelectMany(s => s.MyGuid).ToList()));
Debug.Assert(myMainList.Count == 2);
公共类MyClass
{
公共Guid?MyGuid{get;set;}
}
//.....
Guid?dupGuid1=Guid.NewGuid();
Guid?uniqueGuid1=Guid.NewGuid();
MyClass x1=新MyClass{MyGuid=dupGuid1};
List myMainList=新列表(){x1};
MyClass y1=新MyClass{MyGuid=dupGuid1};
MyClass y2=新MyClass{MyGuid=uniqueGuid1};
List myAddList=新列表{y1,y2};
myMainList.AddRange(myAddList
.Where(w=>w.MyGuid!=myAddList.SelectMany(s=>s.MyGuid.ToList());
Assert(myMainList.Count==2);
我该怎么做?谢谢
var uniqueList = myMainList
.Concat(myAddList)
.GroupBy(item => item.MyGuid)
.Select(group => group.First())
.ToArray();
或
var uniqueList=myMainList
.Concat(myAddList)
.DistinctBy(项=>item.MyGuid)
.ToArray();
公共静态IEnumerable DistinctBy(此IEnumerable items,
功能键控器)
{
var set=新的HashSet();
var list=新列表();
foreach(项目中的var项目)
{
var键=键控器(项目);
if(设置包含(键))
持续
列表。添加(项目);
set.Add(键);
}
退货清单;
}
或
var uniqueList=myMainList
.Concat(myAddList)
.DistinctBy(项=>item.MyGuid)
.ToArray();
公共静态IEnumerable DistinctBy(此IEnumerable items,
功能键控器)
{
var set=新的HashSet();
var list=新列表();
foreach(项目中的var项目)
{
var键=键控器(项目);
if(设置包含(键))
持续
列表。添加(项目);
set.Add(键);
}
退货清单;
}
使用Union()
应该可以做到这一点
摘自:
编辑
您还需要重写类上的GetHashCode()
和Equals(objectobj)
(无论如何都应该这样做)
公共类MyClass
{
公共int ID{get;set;}
公共覆盖布尔等于(对象对象对象)
{
返回this.ID==((MyClass)obj.ID;
}
公共覆盖int GetHashCode()
{
返回ID.GetHashCode();
}
}
var lst1=new List{new MyClass{ID=1},new MyClass{ID=2},new MyClass{ID=3};
var lst2=新列表{new MyClass{ID=3},新MyClass{ID=4},新MyClass{ID=5};
var newList=lst1.Union(lst2);
foreach(newList中的var myClass)
{
WriteLine(“ID:{0}”,myClass.ID);
}
使用Union()
应该可以做到这一点
摘自:
编辑
您还需要重写类上的GetHashCode()
和Equals(objectobj)
(无论如何都应该这样做)
公共类MyClass
{
公共int ID{get;set;}
公共覆盖布尔等于(对象对象对象)
{
返回this.ID==((MyClass)obj.ID;
}
公共覆盖int GetHashCode()
{
返回ID.GetHashCode();
}
}
var lst1=new List{new MyClass{ID=1},new MyClass{ID=2},new MyClass{ID=3};
var lst2=新列表{new MyClass{ID=3},新MyClass{ID=4},新MyClass{ID=5};
var newList=lst1.Union(lst2);
foreach(newList中的var myClass)
{
WriteLine(“ID:{0}”,myClass.ID);
}
为什么要比较Guid?对于一个列表,它甚至不应该编译。不值得回答,而是考虑创建一个通用的<代码> CustomComparer <代码>类,它实现<代码> IEqualityComparer < /Cord>,并采取一些谓词,然后在比较其他自定义类型时可以使用该类。为什么要比较GUID?对于一个列表,它甚至不应该编译。不值得回答,而是考虑创建一个通用的<代码> CustomComparer <代码>类,它实现<代码> IEqualityComparer < /Cord>,并采取一些谓词,然后在比较其他自定义类型时可以使用该类。- 1…我猜您没有注意到他使用的是自定义类MyClass
,这意味着他必须为大多数LINQ方法实现IEqualityComparer
。-1。。我猜您没有注意到他使用的是自定义类MyClass
,这意味着他必须为大多数LINQ方法实现IEqualityComparer
。
var uniqueList = myMainList
.Concat(myAddList)
.DistinctBy(item => item.MyGuid)
.ToArray();
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items,
Func<T, TKey> keyer)
{
var set = new HashSet<TKey>();
var list = new List<T>();
foreach (var item in items)
{
var key = keyer(item);
if (set.Contains(key))
continue;
list.Add(item);
set.Add(key);
}
return list;
}
var list1 = new[] { "a", "s", "d" };
var list2 = new[] { "d", "a", "f", "123" };
var union = list1.Union(list2);
union.Dump(); // this is a LinqPad method
public class MyClass
{
public int ID { get; set; }
public override bool Equals(object obj)
{
return this.ID == ((MyClass)obj).ID;
}
public override int GetHashCode()
{
return ID.GetHashCode();
}
}
var lst1 = new List<MyClass> { new MyClass { ID = 1 }, new MyClass { ID = 2 }, new MyClass { ID = 3 } };
var lst2 = new List<MyClass> { new MyClass { ID = 3 }, new MyClass { ID = 4 }, new MyClass { ID = 5 } };
var newList = lst1.Union(lst2);
foreach (var myClass in newList)
{
Console.WriteLine("ID: {0}", myClass.ID);
}