LINQ过滤器基于两个属性的元素

时间:2017-08-09 10:10:25

标签: c# 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

我想以这样的方式选择此列表中的数据&#34; To&#34;和&#34;来自&#34;属性值位于uniqueKeys

所需结果应为:

To  From
09  04
01  09

我在互联网上经历了很多帖子,我无法用简单的LINQ格式编写逻辑。

如果有人遇到这个问题,请帮助我。

5 个答案:

答案 0 :(得分:7)

让我们说你的班级名单是&#34; listToFrom&#34;。你可以使用&amp;&amp;在两个属性上运算符以获得所需的列表。

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

答案 1 :(得分: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();

答案 2 :(得分: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中的项目数量很少,则可以跳过此性能改进。它会使代码过于复杂化。

答案 3 :(得分: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));

答案 4 :(得分:0)

尝试

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


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