我使用的结构可以表示为:
IEnumerable<KeyValuePair<TKey, TValue>>
鉴于写入时间太长(不计算代码分析可能会发出警告),我宁愿使用更具表现力的类型。 .NET Framework中是否存在此类型,或者我应该创建自己的类型?
请注意,它与字典不同:
IDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
因为字典确保每个键都是唯一的,这不是我的情况。我既不能使用查找:
Lookup<TKey, TValue> : IEnumerable<IGrouping<TKey, TValue>>
因为查找不是懒惰的,即它需要刷新所有数据才能对其进行分组。
答案 0 :(得分:6)
如果您有两个特定类型的键和值,您可以使用类型别名:
using PairSequence = System.Collections.Generic.IEnumerable<
System.Collections.Generic.KeyValuePair<string, int>>;
答案 1 :(得分:2)
这就像它会得到的一样好。结构KeyValuePair在接口方面没有太多实现。您当然可以使用界面继承来创建自己的界面,基本上可以让您重命名IEnumerable<KeyValuePair<TKey, TValue>>
,但是这样做会比通过这种方式获得的损失更多,因为实现IEnumerable<KeyValuePair<TKey, TValue>>
的类型不会实现您的自定义界面。
答案 2 :(得分:1)
IEnumerable<KeyValuePair<TKey, TValue>> <= length: 40 chars
IEnumerable<Tuple<TKey,TValue>> <= length: 32 chars
IList<Tuple<TKey,TValue>> <= length: 26 chars
在某些情况下,您可能会破坏某些using
用法:
using IEI = IEnumerable<int>; // for example
答案 3 :(得分:0)
我不知道框架中的任何内容,代表除了字典之外的这种结构,你已经排除了它。
答案 4 :(得分:0)
不在.NET Framework中,没有。
答案 5 :(得分:0)
只是实施IEnumerable<KeyValuePair<TKey,TValue>>
的问题在于您没有任何后备存储。
作为一般规则,您应该实现代表问题域中的事物的类型,即使是数字和字符串之类的东西也是如此。例如,使用字符串来表示zip / postal代码并不会告诉您有关数据类型的更多信息,但是使用名为PostalCode
的自定义数据类型会告诉您更多信息。更好的是抽象数据类型PostalCode
(可能具有特定国家/地区的具体实现)。
您的自定义类型(尤其是对于集合)可以公开您需要的功能,而无需提供非特定集合类所具有的所有功能。此外,您可以实施与您的问题域相关的域限制。例如,从抽象类型UsZipCode
继承的具体PostalCode
可能会将值限制为5或9个十进制数字,而具体CanadianPostalCode
可能要求值包含2 3个字符的字母数字序列。
但我离题了。
我可能只是创建我自己的类:
public class MyListOfKeysAndValues : IList<KeyValuePair<MyKeyType,MyValueType>>
{
private List<KeyValuePair<MyKeyType,MyValueType>> MyBackingStore ;
...
}
公开所需的最小方法/属性。