已经添加了一个具有相同键的项

本文关键字:一个 添加 | 更新日期: 2023-09-27 18:08:59

即使我在添加之前检查映射是否已经包含键,我收到这个错误…

if (ShortBuffer.ContainsKey(GetTuple(data))) return;
ShortBuffer.Add(GetTuple(data),                 <----- ERROR OCCURS HERE
    new Tuple<Timer, int, bool, Data>(
        new Timer(Convert.ToInt32(Ini.ReadValue("intervals", "clientbuffershort"))), 0, false, data));
GetTuple方法:
private static Tuple<string, string, string> GetTuple(Data data)
{
    return new Tuple<string, string, string>(data.AucxisErrorId, data.ClientId, data.Area);
}

任何想法吗?谢谢!

已经添加了一个具有相同键的项

首先,每次调用GetTuple方法时都会返回一个新实例。它可能包含相同的数据,但它们仍然是不同的对象。所以我要做的第一步是把代码改成这样:

var tuple = GetTuple(data);
if (ShortBuffer.ContainsKey(tuple)) return;
ShortBuffer.Add(tuple, new Tuple<Timer, int, bool, Data>(
    new Timer(Convert.ToInt32(Ini.ReadValue("intervals", "clientbuffershort"))), 0, false));

这可以确保您至少在比较和添加完全相同的对象到映射。

第二,确保Tuple类实现了IEquatable<T>接口。这样可以确保比较Tuple对象的内容,而不是对象存储的内存地址(因为它们彼此不同)。关于如何实现IEquatable<T>接口的更多信息可以在这里找到:https://msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx