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

时间:2016-07-31 17:15:49

标签: c# linq list

我有以下列表

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 == 6RemoteObjectIdtoExceule不在[1,2,[2,3],[5,[6,1],4],7] 的关系列表?

5 个答案:

答案 0 :(得分:1)

您不能在匿名方法中使用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表达式改变了局部变量的生命周期。

答案 1 :(得分:1)

List.Exists采用谓词,即对列表中的项目返回true或false的委托,而不是项目本身。

你想要List.Contains,它会使一个项目返回true或false,具体取决于它是否在列表中。

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

有关正常工作的演示,请参阅this fiddle

答案 2 :(得分:0)

如果您不想使用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();

有关后者的更多信息,请查看here

答案 3 :(得分:0)

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

你可以使用.Any()这将在toExceule中检查是否== RemoteObjectId

答案 4 :(得分:0)

在LINQ Query之后,将拉出当前对象id等于6并且其远程对象id不等于包含在toExclude List中的所有关系列表。

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