执行某些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包含两个列表(顺序是不相关的,因为顺序不相关),每个列表具有相同的值(顺序相同)。他们应该被认为是平等的。

我应该怎么做才能使这些HashSetthisList.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/

10-13 08:24