C# 两个布尔值列表上的逻辑OR

C# 两个布尔值列表上的逻辑OR,c#,list,linq,boolean,logical-operators,C#,List,Linq,Boolean,Logical Operators,我有两个bool列表,它们的长度总是相同的。假设这是我的两个列表: var list1 = new List<bool>() { true, false, true, false, false }; var list2 = new List<bool>() { true, true, true, false, true }; 这样做效果很好,甚至不一定效率低下。但在我的应用程序中,我有两个以上的列表,有时甚至有20个,我需要获得所有列表的OR 考虑到所有列表,有没有一种

我有两个bool列表,它们的长度总是相同的。假设这是我的两个列表:

var list1 = new List<bool>() { true, false, true, false, false };
var list2 = new List<bool>() { true, true, true, false, true };
这样做效果很好,甚至不一定效率低下。但在我的应用程序中,我有两个以上的列表,有时甚至有20个,我需要获得所有列表的OR

考虑到所有列表,有没有一种更简单的方法可以做到这一点?

你可以试试

var result=list1.Ziplist2,first,second=>first | | second;
它通过对来自两个源序列的每对元素应用逻辑OR来生成结果序列。

在对Pavel Anikhouski的回答的评论中,您提到了多个列表。我将使用聚合扩展方法来扩展这个答案

公共静态IEnumerable或ooleanSequenceSiEnumerable源 { 返回source.Aggregatea,b=>a.Zipb,x,y=>x | | y; } 只需将列表作为数组或其他可枚举项传递,然后具体化结果

var list1=新列表{true,false,true,false,false}; var list2=新列表{true,true,false,true,false}; var list3=新列表{false,true,false,true,true,false}; var result=ZipMultiplenew[]{list1,list2,list3}.ToList; 编辑

根据@Theodor Zoulias的建议,我已将上述方法重命名。我选择了OrBooleanSequences。这个名字是相当随意的,所以如果你使用它,并且你想给它取一个对你来说更有意义的名字,那么对你来说就更有力量了

因此,这导致了一个更通用的方法,我将调用AggregateSequences,它将是一个高阶函数,使用一个函数来描述如何在这里和Zip重载中执行聚合结果选择器

公共静态IEnumerable AggregateSequenceEnumerable源,Func resultSelector { 返回source.Aggregatea,b=>a.Zipb,resultSelector; } …然后将逻辑OR操作作为lambda传递给它

var result=aggregateSequenceNew[]{list1,list2,list3},x,y=>x | | y.ToList; 这可以用于其他操作,例如对列表中的元素求和:

var list1=新列表{1,2,3}; var list2=新列表{4,5,6}; var list3=新列表{7,8,9}; var result=AggregateSequencesnew[]{list1,list2,list3},x,y=>x+y.ToList; 结果:

[ 12, 15, 18 ]

当然,这种方法只是一种变体。Zip和Aggregate有多个可以组合的重载。我不确定所有的组合是否都有意义,但我将把它作为练习留给读者。

假设您有一个列表:

var listsOfLists = new List<IEnumerable<bool>>
{
    new List<bool>() { true, false, true, false, false },
    new List<bool>() { true, true, true, false, true },
    new List<bool>() { true, false, true, false, false },
    new List<bool>() { true, false, true, true, true }
};

Zip将对两个选定列表中的每个元素进行配对,并对这些元素对运行or运算符,从而为您提供一个新的布尔列表。生成的列表将在下一个聚合操作中使用。

您知道关于.Zip的信息吗?@gunr217不知道。让我查一下。尝试同步相同长度的列表通常是的症状,可以通过创建包含数据的类来解决。像两个值的逻辑OR这样的属性可以是类属性。@DourHighArch,列表实际上是类的属性。我正在开发一个带有datagrid的WPF应用程序,在这里我根据这些列表的内容显示/隐藏列。datagrid显示文件的内容,由于我不知道用户将选择哪些文件,我不知道将提前有多少列。我如何将此扩展到3个或更多列表?假设我有5个甚至20个?@Sach IMO,在这种情况下,常规循环将更具可读性:但让我想想,我得出了这个var结果=list1.Ziplist2,first,second=>first | | second.Ziplist3,first,second=>first | | second;我想这对3个最合适,但除此之外,它看起来确实像是很好的旧for循环,事实上更容易理解。太好了,这正是我想要的。@gunr217,我想大约20秒的时候。哈哈,不用ZipMultiple,你可以把它命名为具有或作为组件的东西。“或者甚至是简单地或者说,”西奥多·祖利亚斯:这是有道理的。让我想一想。听起来像是高阶函数的一个很好的候选者。@TheodorZoulias:让我知道你对编辑的看法。
var listsOfLists = new List<IEnumerable<bool>>
{
    new List<bool>() { true, false, true, false, false },
    new List<bool>() { true, true, true, false, true },
    new List<bool>() { true, false, true, false, false },
    new List<bool>() { true, false, true, true, true }
};
var combinedResults = listsOfLists
    .Aggregate((a, b) => a
        .Zip(b, (aElement, bElement) => aElement || bElement)
     );