2016-07-31 22 views
0

我有以下列出如何選擇一個屬性不在整數列表中的列表?

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之間的關係列表?

回答

1

您不能在匿名方法內使用out參數。您需要首先將其分配給本地變量。 (我真的不知道你爲什麼要在這種情況下使用的輸出參數,因爲你沒有告訴你整個代碼):

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

如果您想使用存在,你可以嘗試這樣的事:

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

這個技巧純粹是因爲lambda表達式改變了局部變量的生存期。

+0

兩個人都沒有工作。我仍然得到相同的錯誤 – Jaylen

+0

@Jaylen檢查編輯。您需要分配out參數的副本。我不知道你爲什麼在你的情況下使用輸出參數。 – user3185569

+0

創造了慾望的副本工作!謝謝 – Jaylen

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

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

可以使用.Any(),這將做一個foreach一個在toExceule檢查,如果一個== RemoteObjectId

1

List.Exists需要謂詞,即在某項返回true或false代表列表,而不是項目本身。

你想List.Contains,這需要一個項目返回true或false,取決於它是否在列表中。

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

請參閱this fiddle進行工作演示。

0

以下LINQ Query將拉出當前對象ID等於6且沒有其遠程對象ID等於包括在toExclude List中的所有關係列表。

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