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

3

我很想知道是否有任何针对以下问题的LINQ/Lambda表达式解决方案。

我有两个泛型列表

列表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表达式来实现这一目标。
谢谢。
Balan

Where() 方法有一个重载,将索引传递给条件委托,因此,那可能是你所需要的全部。 - Meligy
3个回答

10
var results = listData.Where((item, index) => listFilter[index] == 1);

请注意,如果listData比listFilter更长,那么这将失败,与您的代码相同。


4

一般情况下,您可以执行以下操作:

var result = listData.Zip(listFilter, (data, filter) 
                          => new { Data = data, Filter = filter })
                     .Where(tuple => tuple.Filter == 1)
                     .Select(tuple => tuple.Data)
                     .ToList();

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接