C# 是否存在与IEnumerable相同的结构?

C# 是否存在与IEnumerable相同的结构?,c#,.net,data-structures,ienumerable,lazy-evaluation,C#,.net,Data Structures,Ienumerable,Lazy Evaluation,我使用的结构可以表示为: IEnumerable<KeyValuePair<TKey, TValue>> 如果不考虑代码分析可能会发出警告,那么编写代码就太长了,我更喜欢使用更具表现力的类型。在.NET Framework中是否有这样的类型,或者我应该创建自己的类型 请注意,它与字典不同: IDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>> 因为字典

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

IEnumerable<KeyValuePair<TKey, TValue>>
如果不考虑代码分析可能会发出警告,那么编写代码就太长了,我更喜欢使用更具表现力的类型。在.NET Framework中是否有这样的类型,或者我应该创建自己的类型

请注意,它与字典不同:

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

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

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

我不知道框架中有什么东西代表这样的结构,而不是字典,您已经排除了字典。

我不知道框架中有什么东西代表这样的结构,而不是字典,你已经排除了这一点。

这是最好的选择。struct KeyValuePair没有以接口的方式实现很多功能。当然,您可以使用接口继承创建自己的接口,基本上可以重命名IEnumerable
,但这样做的损失大于收获,因为实现IEnumerable的类型不会实现自定义接口。

这是最好的结果。struct KeyValuePair没有以接口的方式实现很多功能。当然,您可以使用接口继承创建自己的接口,基本上可以重命名IEnumerable
,但这样做的损失大于收获,因为实现IEnumerable的类型不会实现自定义接口。

不在.NET Framework中,不在.NET Framework中,不在.NET Framework中,不。

如果键和值有两种特定类型,则可以通过以下操作使用类型别名:

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

如果键和值有两种特定类型,则可以通过执行以下操作使用类型别名:

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

半开玩笑,半认真

IEnumerable<KeyValuePair<TKey, TValue>>  <= length: 40 chars
IEnumerable<Tuple<TKey,TValue>> <= length: 32 chars
IList<Tuple<TKey,TValue>> <= length: 26 chars

半开玩笑,半认真

IEnumerable<KeyValuePair<TKey, TValue>>  <= length: 40 chars
IEnumerable<Tuple<TKey,TValue>> <= length: 32 chars
IList<Tuple<TKey,TValue>> <= length: 26 chars
仅仅实现IEnumerable的问题是您没有任何备份存储

一般来说,您应该实现表示问题域中的内容的类型,即使是数字和字符串。例如,使用字符串表示邮政编码并不能告诉您有关数据类型的更多信息,但是使用名为PostalCode的自定义数据类型可以告诉您更多信息。更好的方法是使用抽象数据类型PostalCode,它可能具有特定于国家的具体实现

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

但我离题了

我可能会简单地创建自己的类,如下所示:

public class MyListOfKeysAndValues : IList<KeyValuePair<MyKeyType,MyValueType>>
{
  private List<KeyValuePair<MyKeyType,MyValueType>> MyBackingStore ;
  ...
}
公开所需的最小方法/属性。

仅实现IEnumerable的问题在于没有任何备份存储

一般来说,您应该实现表示问题域中的内容的类型,即使是数字和字符串。例如,使用字符串表示邮政编码并不能告诉您有关数据类型的更多信息,但是使用名为PostalCode的自定义数据类型可以告诉您更多信息。更好的方法是使用抽象数据类型PostalCode,它可能具有特定于国家的具体实现

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

但我离题了

我可能会简单地创建自己的类,如下所示:

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

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

添加、删除、查找等操作需要多少时间复杂度?IEnumerable的键入时间较短…实现中是否需要其他约束条件?旁注:设计API时完全不需要键入它-左侧为var,用于自动在右侧发现正确类型的泛型工厂方法…在添加、删除、查找等操作中需要多少时间复杂度?IEnumerable比type短…实现中是否需要任何其他约束?侧注:设计API时,您根本不需要键入它-左侧为var,自动发现右侧正确类型的通用工厂方法+
1-使用别名的指令。我不知道这些:+1-A使用别名指令。我不知道这些:创建自定义类型很简单,只要有一个接受IEnumerable的构造函数,实现该接口,并将所有方法重定向到构造函数中接受的实例。该类型除了使用较短的名称,并将所有调用重定向到封装的对象之外,不会执行任何操作。对于清理代码来说,这可以起到有用的作用。OP问他是否可以避免创建自己的自定义类型。创建自定义类型很简单,只要有一个接受IEnumerable的构造函数,实现该接口,并将所有方法重定向到构造函数中接受的实例即可。该类型除了使用较短的名称,并将所有调用重定向到封装的对象之外,不会执行任何操作。对于清理代码来说,这可以起到有用的作用。OP问他是否可以避免创建自己的自定义类型。