C# Linq:使用Zip排除结果

C# Linq:使用Zip排除结果,c#,linq,C#,Linq,我有一个布尔列表和一个字符串列表。我想使用IEnumerable.Zip组合列表,因此如果第一个列表的每个索引处的值为true,则结果包含第二个列表中的相应项 换言之: List<bool> listA = {true, false, true, false}; List<string> listB = {"alpha", "beta", "gamma", "delta"}; IEnumerable<string> result = listA.Zip(

我有一个布尔列表和一个字符串列表。我想使用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) => new { a, b }).Where(x => x.a).Select(x => x.b);

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

我认为这更简单:

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);

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

如果你可以索引到
列表,你不需要使用
Zip

var res = listB.Where((a, idx) => listA[idx]);

这是我能得到的最简短的内容:

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

其中
具有提供索引的重载。您可以使用它来提取bool列表中的相应项

是的,它会起作用的。只要
listA
是一个真正的列表,而不是
IEnumerable
。我讨厌时髦的索引魔术。这很短,但我必须在心里分析它。@usr我倾向于同意,尽管有适当的命名和在适当的简单上下文中使用(如上文),我认为这没关系。我策划了SharpExtensions(),它有一个扩展方法(IncludeIf/IncludeIf)和许多其他扩展方法。
var items = listB.Where((item, index) => listA[index]);