使用linq比较两个不同类型的列表

时间:2014-01-10 23:27:58

标签: c# linq

我正在寻找一种方法来比较两个列表中的对象。列表中的对象有两种不同的类型,但共享一个键值。 e.g。

public class A
{
    public string PropA1 {get;set;}
    public string PropA2 {get;set;}
    public string Key {get;set;}
}

public class B
{
    public string PropB1 {get;set;}
    public string PropB2 {get;set;}
    public string Key {get;set;}
}

var listA = new List<A>(...);
var listB = new List<B>(...);

获取类型A的对象列表的最快方法是什么,其中listB中不存在键,类型B的对象列表,其中listA中不存在键,以及联合列表具有匹配键的对象?我已经设法使用Linq创建了联合列表:

var joinedList = listA.Join(listB,
    outerkey => outerkey.Key,
    innerkey => innerkey.Key,
    (a, b) => new C
    {
        A = a,
        B = b
    }).ToList();

但这仅包含匹配的课程对象。有没有办法获得其他名单?

1 个答案:

答案 0 :(得分:8)

获取B中没有键的A的集合可以按如下方式完成

var hashSet = new HashSet<String>(bList.Select(x => x.Key));
var diff = aList.Where(x => !hashSet.Contains(x.Key));

反过来就像切换列表一样简单。或者我们可以将其抽象为函数,如下所示

IEnumerable<T1> Diff<T1, T2>(
  IEnumerable<T1> source, 
  IEnumerable<T2> test,
  Func<T1, string> getSourceKey,
  Func<T2, string> getTestKey) {

  var hashSet = new HashSet<string>(test.Select(getTestKey));
  return source.Where(x => !hashSet.Contains(getSourceKey(x));
}

// A where not key in B 
Diff(aList, bList, a => a.Key, b => b.Key);

// B where not key in A
Diff(bList, aList, b => b.Key, a => a.Key);