【问题标题】:Problems with C# ArraySegmentC# ArraySegment 的问题
【发布时间】:2020-05-01 18:04:10
【问题描述】:

我有一个文件中所有字节的数组。

{ 0xA0, 0x00, 0xFF, 0xFF, 0xA0, 0x10, 0x01, 0x00, 0x10, 0x32, 0x0D, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x21, 0x00, 0xF0, 0xF0 }

我还有一个函数可以读取文件的某个部分,并将位置向前移动。 (像 BinaryReader.ReadX() 一样,除了在数组中。

    private static byte[] readBytes(int length)
    {
        cursorLocation += length;
        return new ArraySegment<byte>(bytes, cursorLocation-length, length).ToArray();
    }

但是,当我尝试测试某个字节的某个部分是否相同时,它似乎不起作用。例如,这个:

    byte[] startup = readBytes(4);

    if (startup == new byte[] { 0xA0, 0x00, 0xFF, 0xFF })
    {
        Console.WriteLine("Matches");
    } else
    {
        Console.WriteLine("Does not match.");
    }

返回“不匹配”,而不是“匹配”。我也尝试过连续比较每个数组片段,但这也不起作用。像这样将它们打印成一行:

Console.WriteLine(startup[0]);
Console.WriteLine(startup[1]);
Console.WriteLine(startup[2]);
Console.WriteLine(startup[3]);

按预期返回:

160
0
255
255

我真的不确定出了什么问题,任何帮助将不胜感激。非常感谢!

【问题讨论】:

  • == 在数组上是引用相等检查,而不是内容检查。
  • +@MarcGravell 有趣,我应该改用=== 吗?谢谢
  • C# 中不存在 === 运算符。您必须编写一个自定义方法,逐个元素地比较两个数组。当然,您还应该首先确保它们的长度相同且不为空。

标签: c# arrays .net console console-application


【解决方案1】:

除了我上面的评论之外,这里还有一个可以用来比较数组的方法的实现。

    private static bool AreByteArraysEqual(byte[] expected, byte[] actual)
    {
        return expected != null
            && actual != null
            && expected.Length == actual.Length 
            && Enumerable.Range(0, actual.Length - 1)
                         .All(i => expected[i] == actual[i]);
    }

在您的情况下,使用 == 比较两个数组会返回 false,因为该运算符通过比较两个数组的引用来检查两个数组是否是完全相同的实例,正如 Marc Gravell 在他的评论中已经指出的那样。

更新:

我的回答中有一条评论指出已经有一个 Linq 方法“SequenceEqual”来逐个元素地比较集合。

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多