gpt4 book ai didi

c# - 可以使用 int 作为 KeyedCollection 中的键吗

转载 作者:可可西里 更新时间:2023-11-01 08:43:22 25 4
gpt4 key购买 nike

我经常需要一组带有数字标识符的非顺序对象。我喜欢为此使用 KeyedCollection,但我认为有一个严重的缺点。如果您使用 int 作为键,您将无法再通过索引访问集合的成员(collection[index] 现在实际上是 collection[key])。这是一个足以避免使用 int 作为键的严重问题吗?更好的选择是什么? (也许是 int.ToString()?)

我以前做过这个没有任何大问题,但最近我遇到了一个讨厌的障碍,如果 key 是一个 int,针对 KeyedCollection 的 XML 序列化工作,由于 a bug in .NET .

最佳答案

基本上,您需要确定类的用户是否可能会因为他们不能这样做而感到困惑,例如:

for(int i=0; i=< myCollection.Count; i++)
{
... myCollection[i] ...
}

尽管他们当然可以使用 foreach,或使用强制转换:

for(int i=0; i=< myCollection.Count; i++)
{
... ((Collection<MyType>)myCollection)[i] ...
}

这不是一个容易的决定,因为它很容易导致 heisenbug。我决定在我的一个应用程序中允许它,在该应用程序中,类(class)用户的访问几乎完全是按键。

不过我不确定我是否会为共享类库这样做:一般来说,我会避免在公共(public) API 中公开 KeyedCollection:相反,我会在公共(public) API 中公开 IList ,而消费者需要键控访问的 API 可以使用构造函数定义自己的内部 KeyedCollection,该构造函数采用 IEnumerable 并用它填充集合。这意味着您可以根据从 API 检索到的列表轻松构建新的 KeyedCollection。

关于序列化,还有一个性能问题that I reported to Microsoft Connect : KeyedCollection 维护一个内部字典和一个列表,并对两者进行序列化 - 序列化列表就足够了,因为在反序列化时可以很容易地重新创建字典。

由于这个原因以及 XmlSerialization 错误,我建议您避免序列化 KeyedCollection - 而只序列化 KeyedCollection.Items 列表。

我不喜欢the suggestion of wrapping your int key in another type .在我看来,简单地增加复杂性以便可以将类型用作 KeyedCollection 中的项目是错误的。我会使用字符串键 (ToString) 而不是这样做 - 这很像 VB6 Collection 类。

FWIW,我问了the same question前段时间在MSDN论坛上。 FxCop 团队的一名成员给出了回应,但没有确定的指导方针。

关于c# - 可以使用 int 作为 KeyedCollection 中的键吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/201956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com