2017-08-09 53 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);