比较Linq C中的两个非相关实体集合#

时间:2014-03-31 03:08:15

标签: c# linq

我想使用linq比较两个不相关的实体。

例如 -

实体A

Id         Name            
1          A              
2          B               
3          C
4          D

实体B

Id         Name

1          B

2          C

结果我应该

A, D

从上面的两个集合中,我想通过使用Name属性来比较实体B和实体A,并找出实体B中不可用的记录。

使用一些示例代码可以获得任何帮助。

此致

3 个答案:

答案 0 :(得分:2)

您可以使用LINQ的Except扩展方法。引自MSDN Documentation ...

  

使用默认的相等比较器来比较值,生成两个序列的集合差异。

示例代码

int[] a = { 1, 2, 3, 4, 5 };
int[] b = { 4,5,6,7 };

var c = a.Except(b);

结果

1,2,3

注意

因为您正在使用自定义对象(类),所以需要实现一个使用Name属性比较项目的相等比较器。自定义相等比较器的示例...

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

    public int GetHashCode(CustomObject obj)
    {
        return obj.Name.GetHashCode();
    }
}

然后,您可以在Except扩展方法的重载中使用此自定义相等比较器,假设ab类型为CustomObject ...

var c = a.Except(b, new CustomComparer());

优点是可重用性,特别是如果您将此调用传播到整个项目的Except。然后,如果您需要更改实体(自定义对象),则只需在自定义相等比较器中进行更改

答案 1 :(得分:2)

var result = entityAs.Where(a => !entityBs.Any(b => b.Name == a.Name)).ToList();

答案 2 :(得分:0)

创建一个类     类MyClass     {     public int Id {get;组;}     public string Name {get;组;}     }

创建List1

List<MyCLass> li1 = new List<MyCLass>();

MyCLass o1 = new MyClass();
o1.Id = 1;
o1.Name = "A";
li1.Add(o1);

o1 = new 
o1.Id = 2;
o1.Name = "B";
li1.Add(o1);

o1 = new new MyClass();
o1.Id = 3;
o1.Name = "C";
li1.Add(o1);

o1 = new new MyClass();
o1.Id = 4;
o1.Name = "D";
li1.Add(o1);

创建List2

List<MyCLass> li2 = new List<MyCLass>();
o1 = new new MyClass();
o1.Id = 1;
o1.Name = "B";
li2.Add(o1);

o1 = new new MyClass();
o1.Id = 2;
o1.Name = "C";
li2.Add(o1);

o1 = new new MyClass();
o1.Id = 3;
o1.Name = "D";
li2.Add(o1);

仅选择要从List1

进行比较的所选项目
List<string> SelectedName = li1.Select(s => s.Name).ToList();

仅限FinalList1获取List2中的那些项目

var FinalList = li2.Where(w => SelectedName.Contains(w.Name)).ToList(); 

///或

仅限FinalList2获取那些不在List2中的项目

var FinalList2 = li2.Where(w => !SelectedName.Contains(w.Name)).ToList();