执行某些C#(。NET 4.6,Visual Studio 2015 Professional)的Python开发人员在这里工作。我正在尝试检查两个HashSet
是否相等。
我有两个要尝试比较的HashSet<List<float>>
thisList.SetEquals(otherList);
但是,这会在我的数据上返回false
。使用MSDN HashSet
's examples中的示例可以正常工作。但是,在示例中,它们使用HashSet<int>
,而我使用HashSet<List<float>>
。
由于找不到在Visual Studio中将HashSet
内容打印到即时窗口中的方法(ToString
返回"System.Collections.Generic.HashSet1[System.Collections.Generic.List1[System.Single]]"
),因此我使用Json.NET JsonConvert.SerializeObject(thisList);
将数据转储到磁盘上的.json
文件中。
两个文件(每个HashSet
内容的每个文件是:[[10.0,15.0],[20.0,25.0]]
和[[10.0,15.0],[20.0,25.0]]
调试时在Visual Studio中检查HashSet
看起来像这样:
- thisList Count = 2 System.Collections.Generic.HashSet<System.Collections.Generic.List<float>>
- [0] Count = 2 System.Collections.Generic.List<float>
[0] 10 float
[1] 15 float
+ Raw View
- [1] Count = 2 System.Collections.Generic.List<float>
[0] 20 float
[1] 25 float
+ Raw View
+ Raw View
- otherList Count = 2 System.Collections.Generic.HashSet<System.Collections.Generic.List<float>>
- [0] Count = 2 System.Collections.Generic.List<float>
[0] 20 float
[1] 25 float
+ Raw View
- [1] Count = 2 System.Collections.Generic.List<float>
[0] 10 float
[1] 15 float
+ Raw View
+ Raw View
每个
HashSet
包含两个列表(顺序是不相关的,因为顺序不相关),每个列表具有相同的值(顺序相同)。他们应该被认为是平等的。我应该怎么做才能使这些
HashSet
与thisList.SetEquals(otherList);
相等?编辑:
在每个浮动字体上打印
coord.ToString("G17")
:10
15
20
25
20
25
10
15
最佳答案
因为您在HashSet中使用List,所以它将两个列表作为参考进行比较,而不是考虑Lists中的值。
不要使用List来表示X和Y,而应使用Vector2或Point类。这或多或少是该结构的外观:
public struct Point
{
public double X {get; }
public double Y { get; }
public Point(double x, double y)
{
X = x;
Y = y;
}
public bool Equals(Point other)
{
return X.Equals(other.X) && Y.Equals(other.Y);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
return obj is Point && Equals((Point) obj);
}
public override int GetHashCode()
{
unchecked
{
return (X.GetHashCode() * 397) ^ Y.GetHashCode();
}
}
}
关于c# - 当预期为true时,HashSet <List <float >>上的C#SetEquals为false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50637021/