2013-07-25 3 views
0

У меня есть следующий метод, который сравнивает 2 списка (одного типа) и возвращает различия. Как заставить этот метод принимать списки любого типа?Общий метод сравнения 2 строго типизированных списка

var differences = list1.Where(x => list2.All(x1 => x1.Name != x.Name)) 
      .Union(list2.Where(x => list1.All(x1 => x1.Name != x.Name))); 
+1

Смотреть Http: // StackOverflow .com/вопросы/6462870/Compare-два-родовые-листы – user1929959

ответ

2

Чтобы получить разницу между двумя наборами (с независимостью порядка и кратности независимости), вы можете использовать: HashSet<T>.SymmetricExceptWith(IEnumerable<T>).

public static IEnumerable<T> GetSymmetricDifference<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer = null) 
{ 
    HashSet<T> result = new HashSet<T>(list1, comparer); 
    result.SymmetricExceptWith(list2); 
    return result; 
} 

В вашем случае, чтобы использовать его:

var difference = GetSymmetricDifference(list1, list2, new MyComparer()); 

С пользовательской компаратором:

public class MyComparer : IEqualityComparer<MyType> 
{ 
    public bool Equals(MyType x, MyType y) 
    { 
     return x.Name.Equals(y.Name); 
    } 

    public int GetHashCode(MyType obj) 
    { 
     return obj.Name == null ? 0 : obj.Name.GetHashCode(); 
    } 
} 
0

Что об этом:

var differences = list1.Except(list2).Union(list2.Except(list1)); 
Смежные вопросы