1

我有个问题。我最近将其中一个更改IDictionaryIEnumerable<KeyValuePair>. 这样做是因为不应修改此项目集合。正如我所看到的,这些是相同的,但 IEnumerable 没有实现添加、删除等,这使得这对我和我使用这个集合的领域来说是完美的。

public IDictionary<string, UserInformation> MyItems;
public IEnumerable<KeyValuePair<string, UserInformation>> MyItems;

现在回答我的问题。

  • 如果我不想修改集合,这是最聪明的方法吗?
  • 有没有更聪明的方法来做到这一点?
  • 我这样做是不是很傻?

我之前发现过类似的帖子,但没有一个真正解释使用什么以及为什么。

4

3 回答 3

5

最重要的问题是 anIDictionary旨在用于高效查找。如果您真的只想表示一系列对,那么您的方法是可以的-但KeyValuePair除非关系在语义上确实是键/值,否则我不会使用...在这种情况下,我真的只会使用字典。

当然,您不必公开字典 - 您可以公开获取键值的方法(并且可能还公开键序列和值序列)。

或者,您当然可以创建一个只读实现——这个答案中IDictionary<,>有一个示例实现。

于 2012-08-20T12:17:33.800 回答
1

我会说你可以用一个方法把你包装到某个类中。像这样的东西:IDictionary<string, UserInformation>Get(...)

public class DictionaryWrapper
{
   private IDictionary<string, UserInformation> _dict = .... // dictionary is PRIVATE!

   public UserInformation GetUserInfo(string key)    // method is PUBLIC
   {
      UserInformation ui;
      _dict.TryGetValue(key, out ui);
      return ui;
   }
}

这样你:

  • 限制对 的访问Dictionary,对其公共成员也是如此。
  • 继续受益于字典提供的O(1) 访问速度,当您使用它时会丢失IEnumerable<..>
于 2012-08-20T12:17:37.930 回答
1

根据你的问题,

  1. IEnumerable 是一种巧妙的方式,可以暗示这是一个无法修改的集合。
  2. 将返回类型更改为此有许多缺点,
    1. IEnumnerable<KeyValuePair<string, UserInformation>>可以有重复的键。 IDictionary不能
    2. 虽然集合表示如果实现为字典意味着您拥有所有索引/存储桶等......,调用者不知道这一点。如果他们需要索引事物,他们可以创建自己的字典。
于 2012-08-20T12:25:14.673 回答