如何在一个属性不在整数列表中的情况下选择列表
本文关键字:列表 整数 情况下 选择 一个 属性 | 更新日期: 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 = 6
和RemoteObjectId
不在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 == 6
和RemoteObjectId
不在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
以下LINQ查询将拉取当前对象id等于6且远程对象id不等于的所有关系列表,包括在toExclude列表中。
var result = relations.Where(r => r.CurrentObjectId == 6 && !toExclude.Any(t => t == r.RemoteObjectId)).ToList();