簡體   English   中英

基於兩個屬性的LINQ過濾器元素

[英]LINQ filter Elements based on two properties

我有唯一鍵字符串列表

  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

我想以“ To”和“ From”屬性值都位於uniqueKeys中的方式從此列表中選擇數據

所需結果應為:

To  From
09  04
01  09

我在互聯網上瀏覽過許多帖子,但我無法以簡單的LINQ格式編寫邏輯。

如果有人遇到此問題,請幫助我。

假設您的類名稱列表為“ listToFrom”。 您可以在兩個屬性上使用&&運算符以獲取所需的列表。

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

您可以將多個語句放在.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();

您可以使用.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的項目數uniqueKeys則可以跳過此性能改進。 它將不必要地使代碼復雜化。

可以通過如下組合兩個.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));

嘗試

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


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM