【问题标题】:Compare 2 string array elements and return比较 2 个字符串数组元素并返回
【发布时间】:2018-05-19 07:14:22
【问题描述】:

我实际上是一名 SQL 开发人员,但现在从事 C# 和 LINQ 工作。我心中有一个逻辑,但由于技术障碍,我无法实现它。

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

  1. 我想查找数组 1 中是否存在数组 2 的元素。
  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"}

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

这可能吗?我没有编写任何代码,因为我对 LINQ 完全陌生。如果不是 LINQ,在 C# 中是否可行,请告诉我,

【问题讨论】:

  • 第一个或第二个数组是否有重复项?
  • 您已经展示了两个示例,其中第二个数组的所有成员都存在于第一个数组中。第二个数组的某些元素是否可能不存在于第一个数组中?
  • 没有重复,先生,@OJRaqueño
  • @Zhrez 你的意思是你需要检查重复,或者你确定重复是不可能的?
  • 是的@Steve,它可能。数组 1 就像父级。数组 2 不会有数组 1 中不存在的任何额外元素。它可以相等或更少。

标签: c# arrays linq


【解决方案1】:

您可以使用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。这比我的解决方案好得多。
  • 哇。简单而甜蜜的解决方案。谢谢兄弟。拯救了我的一天。
【解决方案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。谢谢你的时间。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2013-09-04
  • 1970-01-01
  • 2019-03-04
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多