使用SequenceEqual,然后返回不匹配的元素
本文关键字:不匹配 元素 返回 然后 SequenceEqual 使用 | 更新日期: 2023-09-27 18:16:38
我有两个List<string>
,我正在使用SequenceEqual
方法来确定它们是否匹配。
我现在需要得到一个List<int>, string, IEnumerable,
无论索引的元素已经失败。
有简单的方法吗?
谢谢
我想你要:
List<string> list1 = ...
List<string> list2 = ...
var differentIndices = list1.Zip(list2, (item1, item2) => item1 == item2)
.Select((match, index) => new { Match = match, Index = index })
.Where(a => !a.Match)
.Select(a => a.Index);
请注意,如果其中一个列表比另一个列表长,则不会考虑超出较小列表长度的项。
您可以使用LINQ:
var firstFiltered = firstList.Except(secondList);
var secondFiltered = secondList.Except(firstList);
var bothFiltered = firstFiltered.Concat(secondFiltered);
听起来你想要的是与"intersection"相反的东西。交集是存在于两个列表中的项目…并且您希望不存在于两个列表中的项。
下面是一个简单的一行代码:
var items = first.Union(second).Except(first.Intersect(second));
的例子:
var first = new[]{"A","B","C","D"};
var second = new[]{"C","D","E","F"};
var items = first.Union(second).Except(first.Intersect(second));
// Result: "A","B", "E","F"
假设你的列表是list1和list2
IEnumerable<string> setDifferent =
list1.Except(list2);
上面的代码会给你list1中所有不在list2中的元素
使用
var diff = l1.Except(l2);
Array.ForEach(diff.ToArray(), r => Console.WriteLine(r));
如果列表可以是不同的长度,您可以这样做:
IList<string> first = new List<string> { "A", "B", "C", "D", "E", "F" };
IList<string> second = new List<string> { "A", "Z", "C", "D", "Y" };
IList<string> longer = first;
IList<string> shorter = second;
IEnumerable<int> differentIndices = longer.Select((s, i) => i > shorter.Count - 1 || !s.Equals(shorter[i]) ? i : -1).Where(n => n >= 0);
Console.WriteLine(string.Join(", ", differentIndices));
这实际上是一行代码。本例的结果为"1, 4, 5"
。
关键是Select
将匹配的索引映射到-1,然后这些被Where
过滤掉。