我正在尝试写一种方法,它最终会给我一组记录,这些记录在我所引用的不同的集合中不再有相应的记录。
其结构类似于:
public class A
{
int id {get; set;}
int recId {get; set;}
string category {get; set;}
}
public class B
{
int recId {get; set;}
string category {get; set;}
}到目前为止,我使用了以下LINQ来收集丢失的记录,但这只给了我丢失的任何recId:
var noLongerHaveRecordInCollectionB =
CollectionA.Select(x => x.recId).Except(CollectionB.Select(x => x.recId));我需要每个记录的List<A>,这些记录:
1.)在recId中不再有CollectionB。
或
2.)不再有与recId和category在CollectionB中匹配的记录
以为例,可能在CollectionA中有2条记录具有相同的recId,但有不同的category。
如果CollectionB现在只包含该recId的1条记录,我希望删除CollectionA中的记录,该记录没有相应的类别。
因此,最终的问题是,我如何用所有的noLongerHaveRecordInCollectionB A来填充<T>,而不是像现在这样只使用recId,我想要整个对象。
编辑:输入/结果
CollectionA
1,2254,A类
2,2236,A类
3,2415,B类
4,1275,B类<-与下面相同的人,不同类别
5,1275,C类<
CollectionB
2254,A类
2415,B类
1275,C类
预期结果
我希望(从CollectionA)列表中突出显示以下id以供删除: 2,4
发布于 2015-02-27 13:35:56
您可以通过使用Where子句和||条件来实现您想要的结果。没有必要去寻求复杂的解决方案。
var result = collectionA.Where(a => collectionB.Any(b => a.recId == b.recId && a.Category != b.Category)
|| !collectionB.Any(b => b.recId == a.recId));旧答案
您可以为类实现IEqualityComparer,并根据感兴趣的字段对对象进行比较,in.For示例实现如下所示的相等方法:
public bool Equals(A a, B b)
{
return a.recId == b.recId && a.category == b.category ;
}然后只需调用除了方法,并传递您的comparer
var resultList = CollectionA .Except(CollectionB, new MyEqualityComparer());或者,如果在类上实现它,而不是单独的comparer,则只需调用Except。
var resultList = CollectionA .Except(CollectionB);请注意,您还需要实现GetHashCode方法。
更新
如果您想使用IEqualityComparer<T>,可以从第二个列表中创建一个新列表:
var secondListA = CollectionB.Select(x=> new A(){Category=x.Category, recId=x.recId});然后创建您的Comparer
sealed class MyComparer : IEqualityComparer<A>
{
public bool Equals(A x, A y)
{
if (x == null)
return y == null;
else if (y == null)
return false;
else
return x.recId== y.recId&& x.Category == y.Category;
}
public int GetHashCode(A obj)
{
return obj.recId.GetHashCode();
}
}并使用Except()重载,通过使用指定的IEqualityComparer<T>来比较值,从而产生两个序列的设置差异:
var result = CollectionA.Except(secondListA, new MyComparer ());但是我认为您应该使用简单的Where过滤器,因为创建新的A类型列表可能会导致大量性能超值。
https://stackoverflow.com/questions/28766052
复制相似问题