如何在一个属性不在整数列表中的情况下选择列表

本文关键字:列表 整数 情况下 选择 一个 属性 | 更新日期: 2023-09-27 17:59:37

我有以下列表

List<int> toExclude = new List<int>(); //Assume I have number between 1-10
List<ReportObjectRelation> relations = new List<ReportObjectRelation>(); //Assume I have multiple `ReportObjectRelation` objects in this list

我需要拉取relations的列表,其中CurrentObjectId = 6RemoteObjectId不在toExclude列表中。

这是我的ReportObjectRelation对象

public class ReportObjectRelation
{
    //Relation
    public int Id { get; set; }
    public string DisplayName { get; set; }
    public string Alias { get; set; }
    //Local Object
    public int CurrentObjectId { get; set; }
    public string CurrentObjectName { get; set; }
    public int ForeignPropertyId { get; set; }
    public string ForeignProperty { get; set; }
    //Remote Object
    public int RemoteObjectId { get; set; }
    public string RemoteObjectName { get; set; }
    public int LocalPropertyId { get; set; }
    public string RemoteProperty { get; set; }
}

以下是我尝试的

var f = allRelations.Where(x => x.CurrentObjectId == 6 && !toExceule.Exists(x.RemoteObjectId) ).ToList();

但这给了我以下错误

不能将ref-out参数toExceule用作匿名方法、lambda表达式或查询表达式。

如何正确地提取CurrentObjectId == 6RemoteObjectId不在toExceule中的关系列表?

如何在一个属性不在整数列表中的情况下选择列表

不能在匿名方法中使用out参数。您需要首先将其分配给一个局部变量。(我真的不知道为什么在这种情况下使用输出参数,因为你没有显示整个代码):

var copyOfList = toExceule;
var f = allRelations.Where(x => x.CurrentObjectId == 6 
                             && !copyOfList .Contains(x.RemoteObjectId)).ToList();

如果你想使用Exists,你可以试试这样的东西:

var f = allRelations.Where(x => x.CurrentObjectId == 6 
                             && !copyOfList.Exists(y=> y == x.RemoteObjectId)).ToList();

这个技巧纯粹是因为lambda表达式改变了局部变量的生存时间。

List.Exists接受谓词,即为列表中的项而不是项本身返回true或false的委托。

您需要List.Contains,它接受一个返回true或false的项,这取决于它是否在列表中。

var f = allRelations.Where(x => x.CurrentObjectId == 6 
    && !toExclude.Contains(x.RemoteObjectId)).ToList();

看看这个小提琴的工作演示。

如果你不想使用Exists方法,你可以尝试这样的方法:

var f = allRelations.Where(x => x.CurrentObjectId == 6 
                             && !toExclude.Contains(x.RemoteObjectId))
                    .ToList();

另一方面,您可以使用Exists。但是,此方法需要一个谓词。

var f = allRelations.Where(x => x.CurrentObjectId == 6 
                            && !toExclude.Exists(te => te == x.RemoteObjectId))
                    .ToList();

有关后者的更多信息,请查看此处。

    var f = allRelations.Where(x => x.CurrentObjectId == 6 
                            && !toExceule.Any(a=>a==x.RemoteObjectId) )
                        .ToList();

您可以使用.Any(),如果a==RemoteObjectId

,这将在toExcule中执行foreach检查

以下LINQ查询将拉取当前对象id等于6且远程对象id不等于的所有关系列表,包括在toExclude列表中。

var result = relations.Where(r => r.CurrentObjectId == 6 && !toExclude.Any(t => t == r.RemoteObjectId)).ToList();