【问题标题】:SequenceEqual always returning falseSequenceEqual 总是返回 false
【发布时间】:2018-06-17 19:09:28
【问题描述】:

我进行彩票模拟,我有 2 个不同的数组,其中包含 6 个号码,首先是用户希望玩的号码,其次是每次运行生成的号码。

用户在文本框中输入他们的数字,并将其保存为字符串并放置在数组中的各个位置,随机生成的数字也作为字符串保存到字符串数组中。

在此之后我有一个 SequenceEqual 用于比较

bool equal = lotteryNums.SequenceEqual(playerNums);

这总是返回 false,我已将所有生成的数组元素手动设置为 1-6,然后玩家通过文本框相应地编号,但它总是返回 false。

生成的数组目前是这样填充的,用于测试

lotteryNums[0] = "1";
lotteryNums[1] = "2";
lotteryNums[2] = "3";
lotteryNums[3] = "4";
lotteryNums[4] = "5";
lotteryNums[5] = "6";

使用下一个数组位置为下一个数字填充玩家数组

string inputNum = inputBox_txt.Text;
playerNums[0] = inputNum;

为什么这总是返回 false?

由于人们要求数组的顺序完全相同,并且似乎不包含比数组中的数字更多或更少的任何内容

【问题讨论】:

标签: c# arrays


【解决方案1】:

SequenceEqual 如果两个源序列的长度相等,并且根据它们的类型的默认相等比较器,它们的对应元素相等,则返回 true;否则为假。

由于您提供的两个数组不相同,因此您得到的是false

【讨论】:

  • 数组长度相同,应该包含相同的1-6个字符串变量
  • 我不认为 .NET 对 SequenceEqual 有问题。再次检查您的阵列。
  • 正如其他人已经正确回答的那样,您应该在两个数组中具有相同顺序的值。
【解决方案2】:

除了 Athanasios Emmanouilidis 所说的:似乎集合需要具有相同的顺序。所以你应该订购它们:

bool equal = playerNums.OrderBy(n => n).SequenceEqual(lotteryNums.OrderBy(n => n));

【讨论】:

  • 我强烈建议将lotterNums.OrderBy 的结果具体化为列表或数组,以避免一次又一次地执行相同的查询。
【解决方案3】:

要考虑的另一件事:SequenceEquals 要求两个数组中的数字顺序完全相同。即使数组包含相同的数字,但它们的顺序不同,你也会得到错误的。您可以通过在比较之前对每个列表进行排序来解决此问题(只需确保以相同的方式对两者进行排序)。

如果这不起作用,请确认文本框中的字符串实际上只是数字,并且不包含任何空格或特殊字符。

【讨论】:

    【解决方案4】:

    SeqqnceEqual 也将考虑元素的顺序,这在彩票中可能不想要。相反,您想要检查所有预期值是否也在 inout 中:

    var sixCorrects = lotteryNums.All(x => playerNums.Contains(x));
    

    一旦在playerNums 中找不到lotteryNums 的元素,All 就会停止迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2021-11-05
      • 2018-11-05
      • 2019-05-06
      • 2017-04-29
      • 2013-04-30
      相关资源
      最近更新 更多