我想使用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中不可用的记录。
使用一些示例代码可以获得任何帮助。
此致
答案 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
扩展方法的重载中使用此自定义相等比较器,假设a
和b
类型为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();