如何使用其他值从字典中获取值

害怕

我有个问题。我创建了一个这样的字典:

var TriangleRegistry = new Dictionary<string, TriangleRegistryObject>();

像这样的课程:

class TriangleRegistryObject
{
    public double x1 { get; set; }
    public double y1 { get; set; }
    public double x2 { get; set; }
    public double y2 { get; set; }
    public double x3 { get; set; }
    public double y3 { get; set; }
    public bool Selected { get; set; }
}

字典中充满了三角形的坐标。现在,我知道 x1、y1、x2、y2、x3、y3,我想Selected使用 x1、y1、x2、y2、x3、y3获得直角三角形的值
重要的是我使用所有 6 个值来找到第 7 个,因为我得到了很多三角形!
有人能帮我吗?

斯科特·汉南

如果你想存储和检索字典的东西,关键是由三角形的三个坐标了-六个值-那么三角形的组合坐标关键到字典中。

这就是你在这里描述的:

我知道 x1, y1, x2, y2, x3, y3 并且我想使用 x1, y1, x2, y2, x3, y3 获得直角三角形的 Selected 值。

(我回避了 a 是否Dictionary<TriangleRegistryObject, bool>有意义的问题,而是关注如何将三角形的点用作键。)

假设您实际上创建了一个Dictionary<TriangleRegistryObject, bool>,其中键是一个三角形,值是一个布尔值,指示它是否被选中。挑战仍然是,为了确定一个键是否重复,字典将使用引用相等。TriangleRegistryObject具有相同坐标的两个不同实例可能是两个键,这可能不是您想要的。

我们需要的是告诉字典如何比较两个三角形。我们可以通过覆盖EqualsGetHashCodeon来做到这一点TriangleRegistryObject但是,与其更改类以满足这种比较的需要,我们可以只告诉这个特定的字典如何比较三角形(尽管这也可能是一个非常好的解决方案。)

首先,我们将创建一个自定义实现IEqualityComparer<TriangleRegistryObject>

public class TriangleComparer : IEqualityComparer<TriangleRegistryObject>
{
    public bool Equals(TriangleRegistryObject x, TriangleRegistryObject y)
    {
        return x.x1.Equals(y.x1) 
               && x.y1.Equals(y.y1) 
               && x.x2.Equals(y.x2) 
               && x.y2.Equals(y.y2) 
               && x.x3.Equals(y.x3) 
               && x.y3.Equals(y.y3);
    }

    public int GetHashCode(TriangleRegistryObject obj)
    {
        unchecked
        {
            var hashCode = obj.GetHashCode();
            hashCode = (hashCode * 397) ^ obj.GetHashCode();
            hashCode = (hashCode * 397) ^ obj.GetHashCode();
            hashCode = (hashCode * 397) ^ obj.GetHashCode();
            hashCode = (hashCode * 397) ^ obj.GetHashCode();
            hashCode = (hashCode * 397) ^ obj.GetHashCode();
            return hashCode;
        }
    }
}

(好吧,这看起来并不那么简单。我实际上作弊了,让 Resharper 帮助我生成所有这些。)

现在,如果我们想使用三角形作为字典中的键,我们只需在创建字典时指定该比较器:

var dictionary = new Dictionary<TriangleRegistryObject, bool>(new TriangleComparer());

现在字典将按照我们告诉它的方式比较键,而不是使用引用相等。

或者,如果您只想将相等比较直接添加到三角形本身而不是使用自定义比较器,您可以这样做(忽略Selected属性):

public class TriangleRegistryObject
{
    public double x1 { get; set; }
    public double y1 { get; set; }
    public double x2 { get; set; }
    public double y2 { get; set; }
    public double x3 { get; set; }
    public double y3 { get; set; }

    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    protected bool Equals(TriangleRegistryObject other)
    {
        return x1.Equals(other.x1) 
            && y1.Equals(other.y1) 
            && x2.Equals(other.x2) 
            && y2.Equals(other.y2) 
            && x3.Equals(other.x3) 
            && y3.Equals(other.y3);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = x1.GetHashCode();
            hashCode = (hashCode * 397) ^ y1.GetHashCode();
            hashCode = (hashCode * 397) ^ x2.GetHashCode();
            hashCode = (hashCode * 397) ^ y2.GetHashCode();
            hashCode = (hashCode * 397) ^ x3.GetHashCode();
            hashCode = (hashCode * 397) ^ y3.GetHashCode();
            return hashCode;
        }
    }
}

还有一个问题:大概三角形的点不会改变。如果他们可以改变,那么糟糕的事情就会发生。假设您将两个不同的点用作键,然后将其中一个点更改为与另一个点相同。然后你会有重复的键,这会很糟糕。

为了防止这种情况,您可以使三角形类不可变,以便将值传递给构造函数并且永远不能更改。


只是为了涵盖基础,因为我不知道您的应用程序的任何细节:如果您的三角形是结构而不是类,并且其所有成员都是值类型,则将使用值进行比较。如果唯一的值是点(您删除Selected),那么具有相同点的两个实例将被视为相等,并且您不需要所有额外的比较代码。您仍然希望使结构不可变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从字典中获取值列表?

Java:如何从其他程序获取值?

如何使用python中的字典合并其他列表中某个项目的所有值?

使用索引列表从字典中获取值

如何使用获取API从JSON中的先前值获取值?

如何获取包含字典的列表的值以与其他字典进行比较?

如何从其他条件中获取值?

单击行中的其他单元格时如何从单元格中获取值?

SQL根据其他列中的最小值获取值

如何根据其他索引从其他数据框的列中获取值?

如何获取值的值作为字典的键

如何从Scala的application.conf中包含的其他conf文件中获取值

从其他类的变量中获取值

如何从字典Python列表中获取值?

根据其他列值(PySpark)从DataFrame获取值

Javascript通过其他值从多维数组对象中获取值

如何从数组内的字典中获取值?

使用 VBA 从 Excel 中的其他工作表获取值

Python如何从复杂的字典中获取值?

如何从字典列表中获取值并附加

当我不关心外部值的键时,如何在字典字典中获取值

使用来自其他字典的字典值创建字典

如何根据字典中其他键的值删除键值对?

如何通过在其他字典中的字典中使用他的键来获取 python 字典值

如何使用 Pandas 中其他列的其他值获取列的值

如何使用SQL从其他列中只有一个特定值的列中提取值?

从聚合方法获取值到 R 中其他列条件的 NA 值

如何概括从字典键中获取值?

想要获取值匹配的其他列表的值