根据另一个列表中的真实条件从通用列表中选择项目

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

【讨论】:

以上是关于根据另一个列表中的真实条件从通用列表中选择项目的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 根据使用数组从另一个下拉列表中的选择动态创建选项

根据另一个列表中的条件删除一个列表中的某些元素

如何从另一个项目列表中过滤一个项目列表?

jQuery根据下拉列表中的选择将行移动到另一个表

如何从同一平面列表中的另一个项目更改平面列表中项目的状态?

从列表框中选择,从另一个列表框中选择填充