Я бы использовал для этого Линк Except()
, чтобы получить двустороннее сравнение, чтобы найти все элементы, которые есть в списке list1, но не в list2, и наоборот.
Вот пример использования списков строк. Здесь также показано, как найти элементы в обоих списках:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
static class Program
{
public static void Main()
{
List<string> list1 = new List<string>{"A", "B", "C", "D", "E"};
List<string> list2 = new List<string>{"D", "E", "F", "G", "H"};
var inList1ButNotList2 = list1.Except(list2);
var inList2ButNotList1 = list2.Except(list1);
var inBothLists = list1.Intersect(list2);
Console.WriteLine("In list1 but not list2 = " + string.Join(", ", inList1ButNotList2));
Console.WriteLine("In list2 but not list1 = " + string.Join(", ", inList2ButNotList1));
Console.WriteLine("In both lists = " + string.Join(", ", inBothLists));
}
}
}
Чтобы использовать этот подход для вашей задачи, вам нужно иметь две коллекции элементов одного типа для сравнения и метод сравнения. В приведенном выше коде я просто использую компаратор равенства строк по умолчанию, но вы можете создать свой собственный компаратор равенства, например:
public class MyComparer : IEqualityComparer<string> // Instead of string, put your own type.
{
public bool Equals(string x, string y)
{
return string.Equals(x, y); // You'd implement your own comparison here.
}
public int GetHashCode(string obj)
{
return obj.GetHashCode();
}
}
, который вы можете передать Except()
методам:
static class Program
{
public static void Main()
{
List<string> list1 = new List<string>{"A", "B", "C", "D", "E"};
List<string> list2 = new List<string>{"D", "E", "F", "G", "H"};
var comparer = new MyComparer();
var inList1ButNotList2 = list1.Except(list2, comparer);
var inList2ButNotList1 = list2.Except(list1, comparer);
var inBothLists = list1.Intersect(list2, comparer);
Console.WriteLine("In list1 but not list2 = " + string.Join(", ", inList1ButNotList2));
Console.WriteLine("In list2 but not list1 = " + string.Join(", ", inList2ButNotList1));
Console.WriteLine("In both lists = " + string.Join(", ", inBothLists));
}
}