我有一个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);
...但我怀疑有一种更简单的方法可以做到这一点。有吗?
答案 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]);