Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每次将重复对象添加到HashSet时调用方法_C#_Class_Hashset - Fatal编程技术网

C# 每次将重复对象添加到HashSet时调用方法

C# 每次将重复对象添加到HashSet时调用方法,c#,class,hashset,C#,Class,Hashset,我正在使用HashSet创建一个点列表,因为我不希望列表中有重复的点。点有三个属性X坐标(double)、Y坐标(double)和标记(HashSet)。现在我想要的是,每当我在HashSet中添加重复点时,它也会将重复点的标记添加到匹配点 代码 输出我想要的 Point2DHashSet需要一个Add,该Add执行以下自定义逻辑:“如果对象已存在,请将传入点的标记添加到现有points标记hashset。您不能在派生集中替换基Add,因为基Add不是虚拟的,但您可以隐藏它: public ne

我正在使用HashSet创建一个点列表,因为我不希望列表中有重复的点。点有三个属性X坐标(double)、Y坐标(double)和标记(HashSet)。现在我想要的是,每当我在HashSet中添加重复点时,它也会将重复点的标记添加到匹配点

代码 输出我想要的
Point2DHashSet需要一个Add,该Add执行以下自定义逻辑:“如果对象已存在,请将传入点的标记添加到现有points标记hashset。您不能在派生集中替换基Add,因为基Add不是虚拟的,但您可以隐藏它:

public new bool Add(Point2D incoming){

  if(base.TryGetValue(incoming, out var existing))
    existing.Tags.UnionWith(incoming.Tags);
  else
    base.Add(incoming);
}
我想这就是你需要的

但是需要注意的是,您不会得到重复的标记,并且标记也不一定会按添加的顺序出现。您的输出可以很容易地成为当前解决方案的
0,0,End,Start

        public new bool Add(Point2D point)
        {
            var sucess = base.Add(point);
            if (!sucess)
            {
                UpdateTags(point);
            }
            return sucess;
        }

        private void UpdateTags(Point2D point)
        {
            TryGetValue(point, out Point2D pt);
            pt.Tags.UnionWith(point.Tags);
        }       

TryGetValue value不适用于.Net Standard 2任何可用的替代方案?呃,老实说,在这种情况下,我想我应该扔掉HashSet,使用
字典
,其中键是Point2D,值对象总是空的,或者升级一个级别,使用
字典
,让Point2D只有一个字符串而不是HashSet目标hear是将多个几何体分开,并在最后合并,它们的标记对维持顺序很重要?顺序不重要,但对于打印,我应该能够按x或y坐标对其进行排序
0,0,Start,End
10,0,Int1
10,10,Int2
0,10,Int3
public new bool Add(Point2D incoming){

  if(base.TryGetValue(incoming, out var existing))
    existing.Tags.UnionWith(incoming.Tags);
  else
    base.Add(incoming);
}
        public new bool Add(Point2D point)
        {
            var sucess = base.Add(point);
            if (!sucess)
            {
                UpdateTags(point);
            }
            return sucess;
        }

        private void UpdateTags(Point2D point)
        {
            TryGetValue(point, out Point2D pt);
            pt.Tags.UnionWith(point.Tags);
        }