在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<Foo, int>
。同样,我可能希望根据列表中的位置进行快速查找,因此我将拥有Dictionary<int, Foo>
。换句话说,不要尝试将所有内容存储到一个Dictionary<>
。按用例定义它们。
您已经通过AreaKey
定义了一个,并且假设没有两个对象具有相同的枚举,因此在这种情况下使用字典是有意义的。但是,我认为您尝试将所有内容都放在一个键中是走错路了。相反,您可能希望有另一个 Dictionary<string, Area>
引用 Area.name
以便您不仅可以按枚举查找,还可以按名称查找。
稍后您可能想要添加PostCode
,所以再添加一个Dictionary<int, Area>
是有意义的。
总之,定义:
Dictionary<string, Area> mapAreasByName;
Dictionary<int, Area> mapAreasByPostCode;
var area = mapAreasByName["New York"];
area = mapAreasByPostCode[2000];
【讨论】:
以上是关于在c#中区分相同类型的对象以进行检索、比较等的方法是啥的主要内容,如果未能解决你的问题,请参考以下文章