2015-08-21 34 views
1

即使我检查地图是否已经包含了之前我添加它,我收到此错误的关键..C#具有相同键的项已被添加

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); 
} 

有什么想法?谢谢!

+2

是您的应用程序的多线程... – Eser

+0

不,没有,这就是为什么我不明白这一点 –

+1

然后,我们需要的代码重现问题是为了回答你的问题。 (简短但完整的代码示例) –

回答

1

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

这可以确保你ATLEAST比较并添加完全相同的对象地图。

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

+5

'Tuple '是一个.NET类,不能更改。请参阅[这里](https://msdn.microsoft.com/en-us/library/dd268536(v = vs.110).aspx)。 – Maarten

+0

同意,现在我知道;)。积极的一点是它已经实现了IStructuralEquatable(它依次来自IEquatable)。所以你在这里很好。 –

相关问题