我有以下两个清单:
IEnumerable<bool> a = True True True False
List<bool> b = True True False False
如果list a和list b的元素匹配,我需要创建另一个显示true的列表。列表a和b将始终填充并具有相同数量的元素。例如,输出将是:
List<bool> c = True True False True
我能用这么简单的方法吗?我必须使用LINQ吗?我想我可以通过数组进行迭代,但我希望有一种更简单的方法。
答案 0 :(得分:6)
如果您使用的是.NET 4,则可以使用LINQ到IEnumerable.Zip
将两个列表“压缩”到第三个结果列表中。 Zip操作两个列表中的协调元素以生成第三个列表。
第二个参数是定义你想对每对元素做什么的函数。
var c = a.Zip(b, (p, q) => p == q).ToList();
答案 1 :(得分:1)
您可以使用SequenceEquals:
lst1.SequenceEquals(lst2);
此外,如果您需要逐个元素检查,您可以使用Select
子句(如果您有列表或数组不可枚举):
lst1.Select((x,index)=>lst2[index] == x);
答案 2 :(得分:0)
使用按位运算符,您可以手动编码每个元素以进行比较或使用循环。
class Program
{
static void Main(string[] args)
{
IEnumerable<bool> a = new List<bool>() { true, true, true, false };
List<bool> b = new List<bool>() { true, true, false, false };
List<bool> answers = new List<bool>();
for (int i = 0; i < b.Count; i++)
{
answers.Add(a.ElementAt<bool>(i) & b.ElementAt<bool>(i));
}
foreach (bool B in answers)
Console.WriteLine(B);
Console.ReadKey();
}
}
答案 3 :(得分:0)
有两种方法可以解决这个问题:
1)如果没有大量数据,只需循环并创建一个新的列表
2)实现IEnumerable并在两个列表中创建自己的视图(将它们作为构造函数),并实现这些方法,使它们使用基础列表(即对于Current:get,在两个列表之间进行比较)实时)
答案 4 :(得分:0)
这是一个非常简单的方法,不使用LINQ,但使用良好的老式for循环: - )
在这种方法中,您必须将IEnumerable<bool>
转换为List<bool>
,但这很简单。
IEnumerable<bool> z = new List<bool> { true, true, true, false };
var a = new List<bool>(z);
var b = new List<bool> { true, true, false, false };
var result = new List<bool>();
for (int i = 0; i < b.Count ; i++) {
result.Add(a[i] && b[i]);
}
foreach (var r in result)
Console.WriteLine(r);
答案 5 :(得分:0)
您可以使用IComparable并比较两个列表,并在ghosts列表中获得结果。