Вы можете использовать System.Linq
методы расширения Union
(чтобы получить объединение двух списков) вместе с Where
и All
, чтобы отфильтровать элементы, которые вы не хотите включать в первый список:
var result = list2.Union(list1.Where(l1 => list2.All(l2 => l2.ParentId != l1.Id)));
Но учтите, что Union
будет использовать метод класса Equals
, чтобы определить, совпадают ли два элемента (который по умолчанию является эталонным сравнением), поэтому вам придется переопределить Equals
и GetHashCode
для удаления дубликатов (где дубликат будет определен вами, в этом случае, я думаю, будет определено, где совпадают свойства Id
двух элементов, но, возможно, вы также включите ParentId
).
Например:
public class Item
{
public int Id { get; set; }
public int? ParentId { get; set; }
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override bool Equals(object obj)
{
return Id == (obj as Item)?.Id;
}
}
И тогда пример использования будет:
public class Program
{
private static void Main(string[] args)
{
var list1 = new List<Item>
{
new Item {Id = 1, ParentId = null},
new Item {Id = 2, ParentId = null},
new Item {Id = 3, ParentId = 1}
};
var list2 = new List<Item>
{
new Item {Id = 3, ParentId = 1}
};
var result = list2.Union(list1.Where(l1 => list2.All(l2 => l2.ParentId != l1.Id)));
GetKeyFromUser("\nDone! Press any key to exit...");
}
}