gpt4 book ai didi

c# - 比较 2 个表并检查数字是否存在

转载 作者:太空宇宙 更新时间:2023-11-03 22:47:47 24 4
gpt4 key购买 nike

我有 2 个带有随机数的表,我想检查第一个表中的哪个数字在第二个表中不存在并输出它。

Example:
First table: 2, 6, 7, 9
Second table: 0, 6, 11, 3

Output: 2, 7, 9

我当前的代码:

#region CompareTables

int[,] TABLE1 = new int[5, 10];
int[,] TABLE2 = new int[5, 10];

Random rnd = new Random();

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 10; j++)
{
TABLE1[i, j] = rnd.Next(1, 100);
TABLE2[i, j] = rnd.Next(1, 100);
}
}

Console.Write("TABLE1" + "\n\n");

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 10; j++)
Console.Write(TABLE1[i, j] + " " + "\t");
Console.WriteLine();
}

Console.Write("\n");

Console.Write("TABLE2" + "\n\n");

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 10; j++)
Console.Write(TABLE2[i, j] + " " + "\t");
Console.WriteLine();
}

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 10; j++)
if (TABLE1[i, j] == TABLE2[i, j])

Console.WriteLine();
}

Console.ReadKey();
#endregion

请问如何输出第一个表中没有第二个表的数字?

最佳答案

您遇到的问题是您的表是二维数组,而您正试图对它们进行索引,就好像它们是一维数组一样。

看看你是如何填满它们的:

TABLE1[i, j] = rnd.Next(1, 100);
TABLE2[i, j] = rnd.Next(1, 100);

您正确地使用了两个 索引ij (想想行和列)。

但是,稍后您正在做:

if (TABLE1[1] == TABLE2[i])  //where is the second index?

这显然是错误的,但与其让这行得通,不如让我们退后一步,重新考虑一下。所有这些与两个索引混在一起的事情似乎有点......是的,肮脏的,难道没有更好的方法来做到这一点吗?

在您当前的问题中,表格是多维的这一事实只是一种痛苦,并没有真正增加任何值(value)。如果您只需要返回第一个表中没有任何位置信息的第二个表中不存在的元素,那么为什么所有这些麻烦的索引开始呢?让我们创建一个辅助方法来展平数组并使我们能够摆脱至少一个索引:

static IEnumerable<T> Flatten<T>(this T[,] array)
{
for (var i = 0; i < array.GetLength(0); i++)
for (var j = 0; j < array.GetLength(1); j++)
yield return array[i, j];
}

现在我们有了一维数组 (IEnumerable<T> s),我们可以利用 C# 的魔棒...LINQ!解决您的问题非常简单:

var notPresent = TABLE1.Flatten().Except(TABLE2.Flatten());

但如果数组足够大,这可能会产生可怕的性能。记住你将如何手工解决这个问题(以及 Except 也是如何做到的):从表 1 中取出第一个元素,检查表 2 中的所有元素,直到找到匹配项或没有更多元素。从表 1 中取出第二个元素,检查表 2 中的所有元素,直到...等等。这似乎需要很多工作,而且如果表很大,它会增长得非常快。此外,如果您对此不够聪明,您可能会做不必要的额外工作,因为表 1 和表 2 可能包含重复元素...

这可以改进吗?是的,有专门构建的集合可以实现非常快速的搜索; 设置。在你的例子中,一个 HashSet<int>似乎是个不错的选择。

你的代码现在看起来像:

var set = new HashSet<int>(TABLE1.Flatten());
var notPresent = set.Except(TABLE2.Flatten());

这会表现得更好。

关于c# - 比较 2 个表并检查数字是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com