Это можно сделать с помощью LINQ:
var resultList = refList1.Union(refList2).ToList();
Однако для этого требуется, чтобы MyObj
реализовывал IEquatable<MyObj>
, или использовалась другая перегрузка Union
, которая занимает IEqualityComparer<T>
параметр.
Для первого решения потребуется это изменение:
class MyObj : IEquatable<MyObj>
{
int m_id;
public MyObj(int id)
{
this.m_id = id;
}
public int GetId()
{
return this.m_id;
}
public bool Equals(MyObj other)
{
if (ReferenceEquals(null, other)) {
return false;
}
if (ReferenceEquals(this, other)) {
return true;
}
return other.m_id == this.m_id;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) {
return false;
}
if (ReferenceEquals(this, obj)) {
return true;
}
if (obj.GetType() != typeof(MyObj)) {
return false;
}
return Equals((MyObj)obj);
}
public override int GetHashCode()
{
return this.m_id;
}
}
Второе решение будет выглядеть следующим образом:
class MyComparer : IEqualityComparer<MyObj>
{
public bool Equals(MyObj x, MyObj y)
{
return x.GetId() == y.GetId();
}
public int GetHashCode(MyObj obj)
{
return obj.GetId();
}
}
var resultList = refList1.Union(refList2, new MyComparer()).ToList();
и не потребует изменений в class MyObj
.