Linq:使用Zip排除结果

时间:2014-01-10 19:19:27

标签: c# linq

我有一个bool列表和一个字符串列表。我想使用IEnumerable.Zip来组合列表,因此如果第一个列表的每个索引的值为true,则结果包含第二个列表中的相应项。

换句话说:

 List<bool> listA = {true, false, true, false};
 List<string> listB = {"alpha", "beta", "gamma", "delta"};
 IEnumerable<string> result = listA.Zip(listB, [something]); 
 //result contains "alpha", "gamma"

我能提出的最简单的解决方案是:

 listA.Zip(listB, (a, b) => a ? b : null).Where(a => a != null);

...但我怀疑有一种更简单的方法可以做到这一点。有吗?

4 个答案:

答案 0 :(得分:10)

我认为这更简单:

listA
 .Zip(listB, (a, b) => new { a, b } )
 .Where(pair => pair.a)
 .Select(pair => pair.b);

逻辑上将步骤分开。首先,结合列表。接下来,过滤。没有时髦的条件,只需从上到下阅读并立即获得它。

您甚至可以正确命名:

listA
 .Zip(listB, (shouldIncludeValue, value) => new { shouldIncludeValue, value } )
 .Where(pair => pair.shouldIncludeValue)
 .Select(pair => pair.value);

我喜欢自我记录,明显的代码。

答案 1 :(得分:3)

这是我能得到的简短:

var items = listB.Where((item, index) => listA[index]);

Where有一个提供索引的重载。您可以使用它来拉出bool列表中的相应项。

答案 2 :(得分:0)

listA.Zip(listB, (a, b) => new { a, b }).Where(x => x.a).Select(x => x.b);

它使用匿名类型来处理Zip方法子结果。

答案 3 :(得分:0)

如果您可以索引Zip

,则无需使用listA
var res = listB.Where((a, idx) => listA[idx]);