使用SequenceEqual,然后返回不匹配的元素

本文关键字:不匹配 元素 返回 然后 SequenceEqual 使用 | 更新日期: 2023-09-27 18:16:38

我有两个List<string>,我正在使用SequenceEqual方法来确定它们是否匹配。

我现在需要得到一个List<int>, string, IEnumerable,无论索引的元素已经失败。

有简单的方法吗?

谢谢

使用SequenceEqual,然后返回不匹配的元素

我想你要:

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"

假设你的列表是list1list2

 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过滤掉。