比较2个字符串数组元素并返回

时间:2018-05-19 07:14:22

标签: c# arrays linq

我实际上是一名SQL开发人员,但现在正致力于C#和LINQ。我脑子里有一个逻辑,但由于技术障碍,我无法实现它。

我将有2个字符串数组。以下是我想要实施的条件,

  1. 我想查找数组1中是否存在数组2元素。
  2. 然后检查两个数组的元素序列。
  3. 对于前。 正确的案例

    字符串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"}

    这应该返回false,尽管阵列1中存在数组2元素,“Phone”出现在“Address”之前,但是在数组1中,“Address”出现在“Phone”之前。序列不正确,因此它应该返回false。

    这可能吗?我没有编写任何代码,因为我对LINQ来说是全新的。如果在C#中可行,如果不是LINQ,

    ,请告诉我

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。可能有更有效的解决方案。

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