在c#中区分相同类型的对象以进行检索、比较等的方法是啥

Posted

技术标签:

【中文标题】在c#中区分相同类型的对象以进行检索、比较等的方法是啥【英文标题】:What are ways of distinguishing objects of the same type for retrieval, comparison, etc in c#在c#中区分相同类型的对象以进行检索、比较等的方法是什么 【发布时间】:2018-11-21 23:16:17 【问题描述】:

我为这个奇怪的标题道歉,我不知道如何提出这个问题,所以如果你有什么更合适的建议,请告诉我,我会更新它。

通常在编程时,我会使用枚举作为字典的键,其值是与枚举相关的数据。我通常会在意识到会有大量与该枚举相关联的数据之前执行此操作,这将引导我创建数据类型。

例如,我可能有枚举:

public enum AreaKey

    Home,
    Hospital,
    Park,
    TrainStation

然后是一个字典(Vector2 是一个有 2 个整数的类):

Dictionary<AreaKey, Vector2> areaCoordinatesByAreaKey;

后来,我决定我想要一堆与该区域相关的其他数据,因此我构建了一个名为的新类:

    public class Area
    
        Vector2 coordinates;
        string name;
        // more data
    

现在,为了引用这些数据,我知道我可以使用与检索指定区域的键相同的枚举来构建一个字典,但这对我来说总是很麻烦,而且几乎就像它不是正确的 OOP。

我有区域对象。他们有特定的数据应该使他们与众不同。为什么我必须使用枚举?此外,我不喜欢每次意识到我需要一个新区域时都必须打破 OCP。如果能够创建一个对象而不必担心外部管理,那就太棒了。订单 1 检索虽然很好。

当然我可以使用字符串键来检索它,但这意味着人们必须知道字符串并且它不是很安全的类型......枚举很容易阅读。帮我堆栈溢出!

【问题讨论】:

这在很大程度上取决于您希望如何使用它们。拥有以AreaKey 为键的Area 对象的字典似乎有点奇怪,因为您将永远只拥有每种类型的一个区域。 这是不必要的混淆。具有属性的普通类/实例有什么问题?他们读起来像一个魅力。 “为什么我必须使用枚举?”......为此,你不需要。我不明白你为什么这样做。 我认为enum 的使用源于与“人们必须知道字符串”相关的内容。这个问题的一部分你还没有真正写过,这就是你最初是如何到达这里的(我想这是用户提交数据的一些 UI)。 使用一个只能存储 4 个对象的字典是很重的代码味道。很难猜测这是怎么发生的,大脑错误往往很难从代码 sn-p 中识别出来。您只是发现出了问题的一半,请多考虑一下对象身份。 我认为这可能与我们在代码中大量使用单例的事实有关(不是我个人,我们的团队)。单例将包含一堆数据(如区域),我们需要检索这些区域,因此我们将使用带有枚举键的字典......这可能相关吗? 【参考方案1】:

这完全取决于您打算如何检索对象。例如,通常在创建 WinForms 应用程序时(在我了解 数据绑定 的魔力之前)并且我添加了一个项目来表示 ListBox,我可能想要记住每个对象在列表中的位置,以便我以后可以很容易地找回它。我会创建Dictionary&lt;Foo, int&gt;。同样,我可能希望根据列表中的位置进行快速查找,因此我将拥有Dictionary&lt;int, Foo&gt;。换句话说,不要尝试将所有内容存储一个Dictionary&lt;&gt;按用例定义它们。

您已经通过AreaKey 定义了一个,并且假设没有两个对象具有相同的枚举,因此在这种情况下使用字典是有意义的。但是,我认为您尝试将所有内容都放在一个键中是走错路了。相反,您可能希望有另一个 Dictionary&lt;string, Area&gt; 引用 Area.name 以便您不仅可以按枚举查找,还可以按名称查找。

稍后您可能想要添加PostCode,所以再添加一个Dictionary&lt;int, Area&gt; 是有意义的。

总之,定义:

Dictionary<string, Area> mapAreasByName;
Dictionary<int, Area> mapAreasByPostCode;

var area = mapAreasByName["New York"];
area = mapAreasByPostCode[2000];

【讨论】:

以上是关于在c#中区分相同类型的对象以进行检索、比较等的方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

从两个数组中区分额外的元素?

在 SQL Server 2008 中区分两个表架构的最简单方法是啥?

JS中区分参数方法

如何在 Mac 上的 C# 中区分进程的用户

如何在 Web 应用程序中区分用户

java中区分大小写吗???