我有唯一键字符串列表
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格式编写逻辑。
如果有人遇到这个问题,请帮助我。
答案 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);