【问题标题】:Is there a structure identical to IEnumerable<KeyValuePair<TKey, TValue>>?是否有与 IEnumerable<KeyValuePair<TKey, TValue>> 相同的结构?
【发布时间】:2013-03-06 21:11:23
【问题描述】:

我使用的结构可以表示为:

IEnumerable<KeyValuePair<TKey, TValue>>

鉴于编写时间太长(不算代码分析可能会发出警告),我更喜欢使用更具表现力的类型。 .NET Framework 中是否有这种类型,或者我应该创建自己的类型?

注意它和字典不一样:

IDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>

因为字典确保每个键都是唯一的,这不是我的情况。我也不能使用查找:

Lookup<TKey, TValue> : IEnumerable<IGrouping<TKey, TValue>>

因为查找不是惰性的,即它需要刷新所有数据才能对其进行分组。

【问题讨论】:

  • 添加、删除、查找等操作的时间复杂度是多少?
  • IEnumerable&lt;Tuple&lt;T1, T2&gt;&gt; 键入起来更短...
  • 实施上是否需要其他限制?
  • 旁注:设计您的 API 时,您根本不需要键入它 - var 在左侧,通用工厂方法可以自动发现右侧的正确类型...

标签: c# .net data-structures ienumerable lazy-evaluation


【解决方案1】:

如果您有两种特定类型的键和值,您可以通过以下方式使用类型别名:

using PairSequence = System.Collections.Generic.IEnumerable<
    System.Collections.Generic.KeyValuePair<string, int>>;

【讨论】:

【解决方案2】:

这是最好的。结构 KeyValuePair 并没有以接口的方式实现太多。您当然可以使用接口继承来创建自己的接口,基本上让您重命名 IEnumerable<KeyValuePair<TKey, TValue>> ,但这样做会失去更多,因为实现 IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt; 的类型不会实现您的自定义接口。

【讨论】:

    【解决方案3】:

    (半开玩笑半认真)

    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
    

    【讨论】:

      【解决方案4】:

      我不知道框架中有任何东西代表这样的结构,除了你已经排除的字典。

      【讨论】:

        【解决方案5】:

        不在 .NET Framework 中,不。

        【讨论】:

          【解决方案6】:

          只是实现IEnumerable&lt;KeyValuePair&lt;TKey,TValue&gt;&gt;的问题在于您没有任何后备存储。

          作为一般规则,您应该实现代表问题域中事物的类型,即使是数字和字符串之类的事物。例如,使用字符串表示邮政编码并不能告诉您有关数据类型的太多信息,但使用名为 PostalCode 的自定义数据类型可以告诉您更多信息。更好的是 abstract 数据类型 PostalCode(可能具有特定于国家/地区的具体实现)。

          您的自定义类型,尤其是集合,可以只公开您需要的功能,而无需提供非特定集合类所做的所有功能。此外,您可以实施与您的问题域相关的域限制。例如,从抽象类型 PostalCode 继承的具体 UsZipCode 可能会将值限制为 5 位或 9 位十进制数字,而具体的 CanadianPostalCode 可能要求该值由 2 个 3 字符的字母数字序列组成。

          但我离题了。

          我可能会像这样简单地创建自己的类:

          public class MyListOfKeysAndValues : IList<KeyValuePair<MyKeyType,MyValueType>>
          {
            private List<KeyValuePair<MyKeyType,MyValueType>> MyBackingStore ;
            ...
          }
          

          公开所需的最少方法/属性。

          【讨论】:

          • 创建一个自定义类型很简单,只要有一个接受IEnumerable&lt;KeyValuePair&lt;TKey,TValue&gt;&gt; 的构造函数,实现该接口,并将所有方法重定向到您在构造函数中接受的实例。该类型除了具有较短的名称外不会做任何事情,并将所有调用重定向到封装的对象。仅仅为了清理代码,这可以起到有用的作用。 OP 询问他是否可以避免创建自己的自定义类型。
          猜你喜欢
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 2014-02-19
          • 1970-01-01
          • 1970-01-01
          • 2013-08-12
          • 2013-04-08
          • 1970-01-01
          相关资源
          最近更新 更多