C# Linq:使用Zip排除结果
我有一个布尔列表和一个字符串列表。我想使用IEnumerable.Zip组合列表,因此如果第一个列表的每个索引处的值为true,则结果包含第二个列表中的相应项 换言之: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(
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]);