我的程序正在使用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
,但也没有成功。
字典是获取此数据的最佳方式吗?我应该以不同方式加载数据吗?我是否错误地访问了它?感谢您提供任何指导。
答案 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
。