比较两个字符串数组元素并返回结果

3

我实际上是一个SQL开发人员,但现在正在从事C#和LINQ方面的工作。我有一个想法,但由于技术障碍,我无法实现它。

我将有两个字符串数组。以下是我想要实现的条件:

  1. 我想找出数组2中的元素是否存在于数组1中。
  2. 然后检查两个数组的元素序列。

例如。 正确的情况

字符串1: {"ID","Name","Age","Address","Gender","Phone"}

字符串2: {"ID","Name","Phone"}

所以这应该返回true,因为所有数组2元素都存在于数组1中,并且序列也是正确的。

错误的情况

字符串1: {"ID","Name","Age","Address","Gender","Phone"}

字符串2: {"ID","Name","Phone","Address"}

虽然数组2中的元素存在于数组1中,但是"Phone"出现在"Address"之前,在数组1中"Address"在"Phone"之前。序列不正确,所以应该返回false。

这可能吗?我没有写任何代码,因为我完全不了解LINQ。如果C#不能实现,只需指导我即可。


第一个或第二个数组可以有重复项吗? - OJ Raqueño
你展示了两个例子,其中第二个数组的所有成员都存在于第一个数组中。第二个数组中是否可能存在一些元素不在第一个数组中? - Steve
No duplicates sir, @OJRaqueño - Zhrez Pain
@Zhrez,你是指需要检查重复,还是确定不可能存在重复? - ProgrammingLlama
可以的 @Steve。数组1就像是父级,数组2不会有任何数组1中没有的额外元素。它可以相等或更少。 - Zhrez Pain
显示剩余2条评论
2个回答

6
你可以使用IntersectSequenceEqual:
string[] a = new [] {"ID","Name","Age","Address","Gender","Phone"};
string[] b = new [] {"ID","Name","Phone"};
string[] c = new [] {"ID","Name","Phone","Address"};

Console.WriteLine(a.Intersect(b).SequenceEqual(b));
Console.WriteLine(a.Intersect(c).SequenceEqual(c));
Intersect将获取在a和b中都存在的元素,然后SequenceEqual将确保它们按照相同的顺序排列。
值得注意的是,Intersect()实际上调用了.Distinct(),因此它只适用于列表仅包含唯一元素的情况。任一列表中的重复项将被Intersect()忽略。 Fiddle

啊!Intersects。这比我的解决方案好多了。 - Sweeper
1
哇,简单而甜美的解决方案。谢谢兄弟。救了我的一天。 - Zhrez Pain

2
这是一个解决方案:
var mapped = b.Select(x => Array.IndexOf(a, x));
if (!mapped.Contains(-1) && mapped.OrderBy(x => x).SequenceEqual(mapped)) {
    Console.WriteLine("Correct Case");
} else {
    Console.WriteLine("Wrong Case");
}

其中ab分别代表数组1和数组2。可能存在更有效的解决方案。

逻辑很简单,我们选择在a中每个元素的索引在b中。如果b中的一个元素不在其中,则结果中将出现-1。我还检查了mapped.OrderBy(x => x).SequenceEqual(mapped)。如果ba的元素顺序相同,则索引应按升序排列。


感谢您的解决方案 Sweeper。感谢您的时间。 :) - Zhrez Pain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接