IEnumerable <keyvaluepair <string,userinformation =“”>&gt; vs IDictionary <string,userinformation> </string,userinformation> </keyvaluepair <string,>

时间:2012-08-20 12:13:56

标签: c# ienumerable idictionary

我有一个问题。 我最近将IDictionary之一更改为IEnumerable<KeyValuePair>。 之所以这样做是因为不应修改此项目集合。 正如我所看到的那些是相同的,但IEnumerable并没有实现添加,删除等,这使我和我使用这个集合的区域非常完美。

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

现在回答我的问题。

  • 如果我不想要这个系列,这是最明智的选择 改性?
  • 这样做有更聪明的方法吗?
  • 我这样做是不是很蠢?

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

3 个答案:

答案 0 :(得分:5)

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

当然,您不必公开字典 - 您可以公开获取密钥值的方法(也可能会公开一个序列键和一系列值。)

或者您可以创建IDictionary<,>的只读实现 - 当然有一个示例实现in this answer

答案 1 :(得分:1)

我会说你可以使用一个IDictionary<string, UserInformation>方法将<{1}} 包装到某个类中。像这样:

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; } } 的访问,对其公共成员也是如此。
  • 继续受益于字典提供的 O(1)访问速度,您在使用Dictionary时会丢失。

答案 2 :(得分:1)

根据你的问题,

  1. IEnumerable是一种明智的方式,允许暗示这是一个无法修改的集合。
  2. 将返回类型更改为多个缺点,
    1. IEnumnerable<KeyValuePair<string, UserInformation>>可以有重复的密钥。 IDictionary无法
    2. 虽然集合表示如果实现为字典意味着您拥有所有索引/存储桶等...,调用者不知道这一点。如果他们需要索引内容,他们可以创建自己的字典。