我想使用 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 中不可用的记录。
任何帮助都将通过一些示例代码不胜感激。
问候
可以使用 LINQ 的Except
扩展方法。引用自 MSDN 文档...
通过使用默认相等比较器比较值来生成两个序列的集合差值。
示例代码
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
时。然后,如果您需要更改实体(自定义对象),您只需在自定义相等比较器中进行更改
var result = entityAs.Where(a => !entityBs.Any(b => b.Name == a.Name)).ToList();
创建一个类 类 我的类 { public int id {get; set;} 公共字符串名称 {get; set;} }
创建列表1
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);
创建列表2
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);
仅从列表1中选择要比较的选定项目
List<string> SelectedName = li1.Select(s => s.Name).ToList();
仅最终列表 1 获取列表 2 中的那些项目
var FinalList = li2.Where(w => SelectedName.Contains(w.Name)).ToList();
///或
仅 FinalList2 获取不在列表 2 中的项目
var FinalList2 = li2.Where(w => !SelectedName.Contains(w.Name)).ToList();