【发布时间】:2018-11-11 05:13:35
【问题描述】:
一位 Python 开发人员在这里做一些 C#(.NET 4.6,Visual Studio 2015 Professional)工作。我正在尝试检查两个HashSets 是否相等。
我有两个 HashSet<List<float>> 我正在尝试使用它们进行比较
thisList.SetEquals(otherList);
但是,这会在我的数据上返回 false。使用来自MSDN HashSet's examples 的示例确实可以按预期工作。但是,在示例中他们使用HashSet<int>,而我使用HashSet<List<float>>。
由于我找不到将HashSet 内容打印到 Visual Studio 中的即时窗口中的方法(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 中检查 HashSets 如下所示:
- 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 包含两个列表(顺序不相关,因为它是一个集合)并且每个列表具有相同的值(具有相同的顺序)。他们应该被认为是平等的。
我应该怎么做才能使这些HashSets 被认为与thisList.SetEquals(otherList); 相等?
编辑:
在每个浮点数上打印coord.ToString("G17"):
10
15
20
25
20
25
10
15
【问题讨论】:
-
简而言之,因为列表相等性将基于 ReferenceEquals 并且很可能每个集合中有两个不同的列表对象(即使可能具有相同的值)。那是在进入将浮点数与严格相等进行比较的问题之前。但是你想用列表的 HashSet 来完成什么?这感觉有点像 X-Y 问题
-
我喜欢周五下午 X/Y 的味道
-
@lc,感谢您的评论。我有一个玩具
PointCollection类,带有X和Y属性的点。我正在实现一个Equals方法来检查两个集合是否相等,这将是当每个类实例具有相同数量的点时,每个点都具有相同的X和Y坐标。我应该使用元组而不是 HashSet 中的列表吗?因为在 Python 中,set([(10.0, 15.0), (20.0, 25.0)]) == set([(20.0, 25.0), (10.0, 15.0)])是True。 -
@LasseVågsætherKarlsen,更新了问题正文。
-
这实际上是一个 XY 问题 :)
标签: c# .net generics set hashset