2014-01-08 32 views
3

我们的代码库目前有以下EqualityComparer。如何使EqualityComparer与两个字段进行比较?

public static IEnumerable<TSource> Exclude<TSource, TKey>(this IEnumerable<TSource> first, 
                   IEnumerable<TSource> second, 
                   Func<TSource, TKey> keySelector, 
                   IEqualityComparer<TKey> comparer = null) 
    { 
     comparer = comparer ?? EqualityComparer<TKey>.Default; 
     var set = new HashSet<TKey>(second.Select(keySelector), comparer); 
     return first.Where(item => set.Add(keySelector(item))); 
    } 

而我们这样使用它。

// Take the current model and remove all items currently in the database... This leaves us with only records that need to be added. 
var userBooksToAdd = model.UserBooks.Exclude(currentUserBooksFromDatabase, d => d.Id).ToList(); 

我们现在有必要来比较两个字段的数据库,在那里有一个COMPOSITE UNIQUE

基本上

if(currentBooksFromDatabase.BookId == model.BookId && 
    currentBooksFromDatabase.UserId == model.Id) 

我希望创建一个Exclude过载,但我m真的超过了我的头与EqualityComparer

+1

你没关系构建一个自定义的相等比较器吗?你不希望'Default'会以某种方式完成这项工作? –

+1

会在键选择器中返回一个匿名对象吗? '排除(currentUserBooksFromDatabase,d => new {d.Id,d.Name})'只是一个猜测。 – Bort

回答

4

使用匿名对象:

var userBooksToAdd = model.UserBooks.Exclude(currentUserBooksFromDatabase, 
    d => new{ d.Id, d.BookId }).ToList(); 

请注意,匿名对象不会使用object中定义的EqualsGetHashCode实现。他们重写它们以对每个字段进行成员比较,所以这将按预期工作。

+0

完全按照预期工作。我喜欢这种方法。谢谢一堆! –

相关问题