引用,访问数据字典

时间:2015-03-11 17:20:36

标签: c# dictionary data-structures key-value libusb

我的程序正在使用LibUSB与USB设备进行通信,该设备具有按钮和LED,用于向设备发送信息并从设备读取信息。通信以字节数组完成,最长可达1024个,但几乎只有前8个字节很重要。读取时,我们读取字节数组,我想显示按下了哪个按钮或LED亮了。因此,我认为字典是最好的解决方案 - 字符串值用于按钮或LED的名称,字节数组用于键。或者可能是相反的;字符串是键,数组是值。

public class DeviceInput
    {
        public static byte[] PowerArray = { 1, 0, 0, 16, 0, 0, 0, 0 };
        public string Name { get; set; }
        public byte[] InputArray { get; set; }
        public byte[] LEDArray { get; set; }


        public DeviceInput(string name, byte[] input, byte[] led)
        {
            Name = name;
            InputArray = input;
            LEDArray = led;
        }

        public static Dictionary<byte[], string> InputDictionary()
        {
            var dict = new Dictionary<byte[], string>();
            dict.Add(PowerArray, "Power Button");

            return dict;
        }

    }

在我的主程序中:

public Dictionary<byte[], string> inputDict = DeviceInput.InputDictionary();

并且在我的read方法中,我使用读入字节数组并将前8个字节存储到本地数组中,我使用.ContainsKey()来查看Dictionary是否包含键(字节数组),然后将向用户显示值(字符串)。

byte[] data = 
{ 
    readBuffer[0], readBuffer[1], readBuffer[2], readBuffer[3],
    readBuffer[4], readBuffer[5], readBuffer[6], readBuffer[7]
};

if (inputDict.ContainsKey(data))
{
    Console.WriteLine("You pressed: " + inputDict[data]);
}

设备中的readBuffer运行正常,数组填充完整,与我创建的字节数组(PowerArray)完全相同,所以我不确定ContainsKey是如何&#39工作。即使我将词典切换为<string, byte[]>并尝试ContainsValue而不是ContainsKey,但也没有成功。

字典是获取此数据的最佳方式吗?我应该以不同方式加载数据吗?我是否错误地访问了它?感谢您提供任何指导。

1 个答案:

答案 0 :(得分:1)

这将解决您的问题(类似于@juharr建议的)

class PowerArrayEqualityComparer : IEqualityComparer<byte[]>
{
    public bool Equals(byte[] x, byte[] y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(byte[] obj)
    {
        return obj.Aggregate(0, (current, b) => current ^ b);
    }
}

你会以这样的形式使用你的字典:

        Dictionary<byte[], string> myDict = 
            new Dictionary<byte[], string>(new PowerArrayEqualityComparer());

或者像这样初始化它:

        var d = new Dictionary<byte[], string>(new PowerArrayEqualityComparer())
        {
            {new byte[] {0, 1, 2, 3}, "Button1"},
            {new byte[] {1, 1, 2, 3}, "Button2"}
        };

唯一不同的是在您的词典的构造函数中包含PowerArrayEqualityComparer类 - 就像这个new PowerArrayEqualityComparer()一样,在初始化词典时确保它在那里。

只有这样,您才能将byte[]用作词典TKey

因此,从那时开始,代码将会正常工作:

        var b = new byte[] {1, 1, 2, 3};
        Debug.WriteLine(d.ContainsKey(b));  

输出True