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