根据另一个列表中的真实条件从通用列表中选择项目
Posted
技术标签:
【中文标题】根据另一个列表中的真实条件从通用列表中选择项目【英文标题】:Selecting items from generic list based on true condition from another list 【发布时间】:2012-05-09 18:57:21 【问题描述】:我想知道是否有针对以下问题的任何 LINQ/Lambda 表达式解决方案。
我有 2 个通用列表
列表 1
public class Data
public string ID get; set;
public string Package get; set;
List<Data> listData = new List<Data>();
Data data1 = new Data ID = "1", Package = "Test" ;
Data data2 = new Data ID = "2", Package = "Test2" ;
Data data3 = new Data ID = "3", Package = "Test2" ;
Data data4 = new Data ID = "4", Package = "Test4" ;
listData.Add(data1);
listData.Add(data2);
listData.Add(data3);
listData.Add(data4);
清单 2
List<int> listFilter = List<int>();
listFilter.Add(1);
listFilter.Add(0);
listFilter.Add(0);
listFilter.Add(1);
我想根据“listFilter”中的真 (1) 标准过滤“listData”。对于上面的示例,我必须能够将 data1 和 data4 拉到一个新列表中。
目前,我正在使用 for 循环来实现这一点,如下所示。
List<Data> listResult = new List<Data>();
for(int index=0; index<listData.Count; index++)
if(listFilter[index]==1)
listResult.Add(listData[index]);
如果有人能告诉我使用 LINQ 或 Lambda 表达式来实现这一点,我将不胜感激。
谢谢
巴兰
【问题讨论】:
Where()
方法具有将索引传递给条件委托的重载,因此,这可能就是您所需要的。
【参考方案1】:
var results = listData.Where((item, index) => listFilter[index] == 1);
请注意,如果 listData 比 listFilter 长,这将失败,与您的代码相同。
【讨论】:
【参考方案2】:一般情况下,你可以这样做:
var result = listData.Zip(listFilter, (data, filter)
=> new Data = data, Filter = filter )
.Where(tuple => tuple.Filter == 1)
.Select(tuple => tuple.Data)
.ToList();
【讨论】:
【参考方案3】:var listResult = listData
.Where((data, index) => listFilter[index] == 1)
.ToList();
参考:
http://msdn.microsoft.com/en-us/library/bb548547.aspx
【讨论】:
以上是关于根据另一个列表中的真实条件从通用列表中选择项目的主要内容,如果未能解决你的问题,请参考以下文章