首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用除多个属性外的其他方法筛选列表

使用除多个属性外的其他方法筛选列表
EN

Stack Overflow用户
提问于 2015-02-27 13:16:12
回答 2查看 2K关注 0票数 1

我正在尝试写一种方法,它最终会给我一组记录,这些记录在我所引用的不同的集合中不再有相应的记录。

其结构类似于:

代码语言:javascript
复制
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

代码语言:javascript
复制
var noLongerHaveRecordInCollectionB =
CollectionA.Select(x => x.recId).Except(CollectionB.Select(x => x.recId));

我需要每个记录的List<A>,这些记录:

1.)在recId中不再有CollectionB

2.)不再有与recIdcategoryCollectionB中匹配的记录

为例,可能在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

EN

Stack Overflow用户

回答已采纳

发布于 2015-02-27 13:35:56

您可以通过使用Where子句和||条件来实现您想要的结果。没有必要去寻求复杂的解决方案。

代码语言:javascript
复制
 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示例实现如下所示的相等方法:

代码语言:javascript
复制
public bool Equals(A a, B b)
{
    return a.recId  == b.recId && a.category == b.category ;
}

然后只需调用除了方法,并传递您的comparer

代码语言:javascript
复制
var resultList = CollectionA .Except(CollectionB, new MyEqualityComparer());

或者,如果在类上实现它,而不是单独的comparer,则只需调用Except

代码语言:javascript
复制
var resultList = CollectionA .Except(CollectionB);

请注意,您还需要实现GetHashCode方法。

更新

如果您想使用IEqualityComparer<T>,可以从第二个列表中创建一个新列表:

代码语言:javascript
复制
  var secondListA = CollectionB.Select(x=> new A(){Category=x.Category, recId=x.recId});

然后创建您的Comparer

代码语言:javascript
复制
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>来比较值,从而产生两个序列的设置差异:

代码语言:javascript
复制
    var result = CollectionA.Except(secondListA, new MyComparer ());

但是我认为您应该使用简单的Where过滤器,因为创建新的A类型列表可能会导致大量性能超值。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28766052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档