【发布时间】:2013-10-06 12:33:10
【问题描述】:
我正在获取字典中的第一个键并将其与查找值进行比较。它们是相同的,但是当我尝试从字典中访问密钥时,我得到一个KeyNotFoundException:
public void Draw(Graphics graphics, Shape shape)
{
foreach (var line in shape.Lines)
{
var tuple = shape.LinesToNurmalDictionary.Keys.First();
bool equals = tuple == line;
bool referenceEquals = ReferenceEquals(tuple, line);
var invisible = shape.LinesToNurmalDictionary[line].All(x => x.Z < 0);
我该如何解决?
添加: 字典是
Dictionary<Tuple<ShapePoint, ShapePoint>, List<ShapePoint>> LinesToNurmalDictionary;
ShapePoint 是一个类
所以我通过使用我自己的类而不是元组来“解决”我的问题,但实际上问题仍然没有得到回应:
public class Line
{
public ShapePoint A { get; set; }
public ShapePoint B { get; set; }
public List<ShapePoint> Normals { get; set; }
public Line(ShapePoint a, ShapePoint b)
{
A = a;
B = b;
Normals = new List<ShapePoint>();
}
private sealed class DefaultEqualityComparer : IEqualityComparer<Line>
{
public bool Equals(Line x, Line y)
{
if (ReferenceEquals(x, y))
return true;
if (ReferenceEquals(x, null))
return false;
if (ReferenceEquals(y, null))
return false;
if (x.GetType() != y.GetType())
return false;
return Equals(x.A, y.A) && Equals(x.B, y.B);
}
public int GetHashCode(Line obj)
{
unchecked
{
return ((obj.A != null ? obj.A.GetHashCode() : 0)*397) ^ (obj.B != null ? obj.B.GetHashCode() : 0);
}
}
}
private static readonly IEqualityComparer<Line> DefaultComparerInstance = new DefaultEqualityComparer();
public static IEqualityComparer<Line> DefaultComparer
{
get
{
return DefaultComparerInstance;
}
}
}
【问题讨论】:
-
您是否在您的线型中覆盖了 Equals、GetHashCode 等?
-
它是元组
-
在调用
First()和索引器访问之间是否有其他线程可以删除该键? -
它是 WinForm 应用程序(你可以看到,我正在使用 Graphics 类进行绘图),所以它是 [STAThread] 并且我没有创建任何额外的线程/任务/等
-
@Alex 顺便回复 cmets 请使用
@通知。
标签: c# .net collections dictionary