我实际上是一名SQL开发人员,但现在正致力于C#和LINQ。我脑子里有一个逻辑,但由于技术障碍,我无法实现它。
我将有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,尽管阵列1中存在数组2元素,“Phone”出现在“Address”之前,但是在数组1中,“Address”出现在“Phone”之前。序列不正确,因此它应该返回false。
这可能吗?我没有编写任何代码,因为我对LINQ来说是全新的。如果在C#中可行,如果不是LINQ,
,请告诉我答案 0 :(得分:6)
您可以使用Intersect
和SequenceEqual
:
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()
将忽略任一列表中的重复项目。
答案 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");
}
其中a
和b
分别是数组1和数组2。可能有更有效的解决方案。
逻辑非常简单,我们在b
中选择a
的每个元素的索引。如果b
中的一个元素不在一个元素中,则结果中会有-1
。我还检查了mapped.OrderBy(x => x).SequenceEqual(mapped)
。如果b
具有相同顺序的a
个元素,则索引应按升序排列。