2011-02-24 48 views

回答

4

我怀疑这主要是因为意图不同。

ILookup<T,U>专门设计用于处理值的集合。 IDictionary<T,U>旨在使用单个值(当然,这可能是一个集合)。当然你可以用IDictionary<T,U>通过返回一个值为IEnumerable<U>来实现这一点,这会让人困惑,尤其是如果你的“U”是一个集合本身(即:List<int>),尤其如此。在这种情况下,ILookup<T,U>.Item会返回一个IEnumerable<List<int>>,还是应该对IEnumerable<T>值类型进行某种类型的检查,然后将其“变平”?无论哪种方式,它会看起来很混乱,并添加可疑的价值。

+0

这不只是“意图”是不同的。字典是每个键的一个值。一个ILookup是每个键的一个或多个值。此外,ILookup只能由LINQ查询创建,并且是不可变的;您不能在以后添加更多的键或值。 (至少3.5,这是真的;不知道约4.0) – 2011-02-24 02:00:19

+0

@Cylon:ILookup是一个接口 - 如果你愿意,你可以实现你自己的版本,这是不可改变的。正如我所提到的,你*可以*强迫'字典'实施'ILookup ',但如果你这样做会令人困惑。 – 2011-02-24 02:04:51

1

我怀疑这是因为IDictionary'2接口早在ILookup'2之前就出现了。回去修改是不必要的。具体实现可以使用ILookup'2。我不明白修改人们多年来一直使用的界面会带来什么。

+0

我想你也可以翻转你的陈述。我没有看到修改界面会损害什么。是的,ILookup更新,但这并不意味着它不会描述IDictionary正在做什么。仅仅因为你和我看不到有什么可以获得的东西并不意味着它不会帮助那里的人,这仅仅意味着我们不能亲自看到如何。 – Josh 2011-02-25 16:32:05

+1

如果人们修改现有和流行界面的行为会发生什么?哦,为什么没有伤害会出来..... – surfasb 2011-06-21 22:58:52

2

接口IDictionary<T,U>ILookup<T,U>都继承IEnumerable。如果将IDictionary<T,U>转换为IEnumerable并对其调用GetEnumerator(),则生成的枚举器应返回KeyValuePair<T,U>的实例。如果将ILookup<T,U>转换为IEnumerable并调用GetEnumerator(),则生成的枚举器应返回IGrouping<T,U>的实例。如果KeyValuePair<T,U>结构被修改为执行IGrouping<T,U>这可能是可行的,但几乎不干净。

相关问题