c# - Linq:使用 Zip 排除结果

标签 c# linq

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

换句话说:

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

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

最佳答案

我觉得这样更简单:

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

我喜欢 self 记录、明显的代码。

关于c# - Linq:使用 Zip 排除结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052639/

相关文章:

c# - 如何反序列化 JArray?

c# - 如何在 JSON 中为空 DataTable 包含列元数据

c# - 修改linq以获取前5个元素

c# - 使用C#访问Oracle DB时总是遇到ORA-00936缺少express

c# - 当我在 Visual Studio 中发布 Azure 函数时包含文件

c# - 禁用和启用后 WPF 文本框焦点 "sticking"

c# - 如何从表中获取所有行

c# - Lambda 表达式 - 如何从 IEnumerable<Object> 向 where 子句提供值?

c# - Linq 何时自动调用实现 IEnumerator<T> 的类的 Dispose()?

林克 : How do I test a List<bool> for condition where any one of its values == true?