2017-08-09 65 views
0

我有獨特的鍵LINQ過濾元件

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 

我試圖篩選基於這些獨特的按鍵另一個列表的字符串列表。

數據在列表中可以看到這樣的:

To From  
01 05 
01 02 
09 04 
01 09 
01 45 
04 06 
27 12 

我想要的方式來選擇,這兩個「收件人」和「發件人」屬性值位於uniqueKeys從這個名單數據

理想的結果應當是:

To From 
09 04 
01 09 

我已經通過了互聯網的很多帖子,我不能寫在SIMPL邏輯e LINQ格式。

如果有人遇到了這個問題,請幫助我。

+0

分組? [This](https://stackoverflow.com/questions/5231845/c-sharp-linq-group-by-on-multiple-columns)可能有幫助 – user3185569

+1

您的列表是否被篩選出自定義對象或字典列表? –

+0

LINQ中的List 不可能與LINQ中的List 相關聯,您應該使用List > –

回答

6

假設您的類名稱列表是「listToFrom」。您可以使用兩個屬性上的& &運算符來獲取所需的列表。

var filteredList = listToFrom.Where(x=>uniqueKeys.Contains(x.To) && 
        uniqueKeys.Contains(x.From)).ToList(); 
+0

您在'.ToList()' –

+0

之前缺少''''謝謝@JakubDąbek。更正:) – Harsh

2

您可以使用.Contains來檢查集合是否包含項目。此外,您可以利用LINQ .Where過濾具有指定條件的集合。

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 
var result = data 
    .Where(x => uniqueKeys.Contains(x.From) && uniqueKeys.Contains(x.To)) 
    .ToArray(); 

另外一兩件事要記住 - 這種算法是線性的,即它會檢查一次,如果它包含一個值時迭代uniqueKeys。 使用HashSet可以提高性能,其中提供O(1).Contains檢查。

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 
var uniqueKeysSet = new HashSet<string>(uniqueKeys); 
var result = data 
    .Where(x => uniqueKeysSet.Contains(x.From) && uniqueKeysSet.Contains(x.To)) 
    .ToArray(); 

但是,您可以跳過此性能改進,如果項目在uniqueKeys數量較少。它會過分複雜的代碼而不需要。

0

這可以通過組合兩個.Contains() LINQ條款如下進行:

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 

var data = new List<Tuple<string, string>> { 
new Tuple<string, string>("01", "05"), 
new Tuple<string, string>("01", "02"), 
new Tuple<string, string>("09", "04"), 
new Tuple<string, string>("01", "09"), 
new Tuple<string, string>("01", "45"), 
new Tuple<string, string>("04", "06"), 
new Tuple<string, string>("27", "12") 
}; 

var results = data.Where(d => uniqueKeys.Contains(d.Item1) && uniqueKeys.Contains(d.Item2)); 
3

你可以把幾個語句在.Where這樣你就可以在多個領域進行過濾,在這種情況下,關鍵是.Contains

//Making test data 
List<Example> dataList = new List<Example>() 
{ 
    new Example() { From = "05", To = "01" }, 
    new Example() { From = "02", To = "01" }, 
    new Example() { From = "04", To = "09" }, 
    new Example() { From = "09", To = "01" }, 
    new Example() { From = "45", To = "01" }, 
    new Example() { From = "06", To = "04" }, 
    new Example() { From = "12", To = "27" } 
}; 
var uniqueKeys = new List<string> { "01", "04", "09", "26", "27" }; 

//Filter data 
var filteredList = dataList 
        .Where(row => uniqueKeys.Contains(row.To) && 
            uniqueKeys.Contains(row.From)) 
        .ToList(); 
0

兩列嘗試

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 


    List<Example> filtedvalues = Maindatas.FindAll(emp => uniqueKeys == emp.to && uniqueKeys == emp.from);