C# IEnumerable<;KeyValuePair<;字符串,用户信息>&燃气轮机;vs IDictionary<;字符串,用户信息>;

C# IEnumerable<;KeyValuePair<;字符串,用户信息>&燃气轮机;vs IDictionary<;字符串,用户信息>;,c#,ienumerable,idictionary,C#,Ienumerable,Idictionary,我有个问题。 我最近将我的I字典中的一个更改为I字典。 这是因为不应修改此项集合。 正如我所看到的,这些都是相同的,但IEnumerable没有实现添加、删除等功能,这使我和我使用此集合的领域非常完美 public IDictionary<string, UserInformation> MyItems; public IEnumerable<KeyValuePair<string, UserInformation>> MyItems; 公共IDiction

我有个问题。 我最近将我的
I字典
中的一个更改为
I字典
。 这是因为不应修改此项集合。 正如我所看到的,这些都是相同的,但IEnumerable没有实现添加、删除等功能,这使我和我使用此集合的领域非常完美

public IDictionary<string, UserInformation> MyItems;
public IEnumerable<KeyValuePair<string, UserInformation>> MyItems;
公共IDictionary MyItems;
公共可数项目;
现在回答我的问题

  • 如果我不想让这些收藏品过时,这是最明智的方式吗 修改
  • 有没有更聪明的方法
  • 我这样做是不是很愚蠢

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

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

当然,您不必公开字典——您可以公开只获取一个键的值的方法(还可能公开一系列键和一系列值)


当然,您也可以创建
IDictionary
的只读实现—这里有一个示例实现。

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

当然,您不必公开字典——您可以公开只获取一个键的值的方法(还可能公开一系列键和一系列值)

当然,您也可以创建
IDictionary
的只读实现——这里有一个示例实现。

我想说,您可以使用一个
Get(…)
方法将
IDictionary
包装到某个类中。大概是这样的:

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;
   }
}
公共类字典说唱者
{
私有IDictionary _dict=..//字典是私有的!
public UserInformation GetUserInfo(字符串键)//方法为public
{
用户信息界面;
_dict.TryGetValue(键,输出ui);
返回用户界面;
}
}
通过这种方式,您可以:

  • 限制对
    词典
    的访问,以及对其公共成员的访问
  • 继续受益于词典提供的O(1)访问速度,如果改用
    IEnumerable
    则会失去该速度
我想说,您可以使用一个
Get(…)
方法将您的
IDictionary
封装到某个类中。大概是这样的:

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;
   }
}
公共类字典说唱者
{
私有IDictionary _dict=..//字典是私有的!
public UserInformation GetUserInfo(字符串键)//方法为public
{
用户信息界面;
_dict.TryGetValue(键,输出ui);
返回用户界面;
}
}
通过这种方式,您可以:

  • 限制对
    词典
    的访问,以及对其公共成员的访问
  • 继续受益于词典提供的O(1)访问速度,如果改用
    IEnumerable
    则会失去该速度
通过您的提问

  • IEnumerable是一种聪明的方式,它允许暗示这是一个不能修改的集合
  • 将您的回报类型更改为该类型有很多缺点,
  • IEnumnerable
    可以有重复的密钥<代码>IDictionary无法
  • 尽管集合表示如果实现为字典,则意味着您拥有所有索引/存储桶等,但调用方并不知道这一点。如果需要索引,他们可以创建自己的词典
  • 通过你的提问

  • IEnumerable是一种聪明的方式,它允许暗示这是一个不能修改的集合
  • 将您的回报类型更改为该类型有很多缺点,
  • IEnumnerable
    可以有重复的密钥<代码>IDictionary无法
  • 尽管集合表示如果实现为字典,则意味着您拥有所有索引/存储桶等,但调用方并不知道这一点。如果需要索引,他们可以创建自己的词典

  • 在我看来,这是一个糟糕的解决方案,因为您丢失了键索引,这是字典的主要功能。关于只读词典,请看一下我在这里建议的解决方案:您可以使用
    System.Collections.ObjectModel.ReadOnlyDictionary
    确实没有足够的上下文来回答这个问题-您希望如何使用这个集合?如何初始化它?谁将使用它(您?同事?第三方?)?这是公共API的一部分吗?在我看来,这是一个糟糕的解决方案,因为您丢失了键索引,这是字典的主要功能。关于只读词典,请看一下我在这里建议的解决方案:您可以使用
    System.Collections.ObjectModel.ReadOnlyDictionary
    确实没有足够的上下文来回答这个问题-您希望如何使用这个集合?如何初始化它?谁将使用它(您?同事?第三方?)?这是公共API的一部分吗?有一秒钟我以为你会链接我的答案=)谢谢你的回答。我将使用只读实现,它似乎非常适合这个集合。我还将尝试更改基础结构,这样就不必公开字典,这就是我为什么考虑使用IEnumerable of KeyValuePair的原因。非常感谢。(最后我可以把它保密,我们