不知道我忽略了哪一点。IGrouping<out TKey, out TElement>
是被LINQ GroupBy
. 此外,同样的逻辑也适用于 ILookup
,IIRC。相应地,它们可以返回多个值,但必须符合指定的键。然而,我反而希望下面的签名能够这样做。
interface IGrouping<out TKey, out IEnumerable<TElement>>
^^^^^^^^^^^^^
最初,它实现了 IEnumerable<TElement>
和 IEnumerable
的向后兼容性。这是否能完成同样的任务?如果是,如何实现?我不明白。
public interface ILookup<TKey,TElement> : IEnumerable<IGrouping<TKey,TElement>>
下面的意思是 ILookup
所用 Join/GroupJoin
有多个键与多个值的关联?你能举例说明吗?我看了 问题但不明白其中的区别,除了他们的懒惰评估与即时评估语义。
不想让事情变得更复杂,但输出可能对大家有帮助。
如果你看一下 IGrouping
,
public interface IGrouping<out TKey,out TElement> : System.Collections.Generic.IEnumerable<out TElement>
你可以看到,上面写着"IGrouping<TKey, TElement>
是一种 IEnumerable<TElement>
".
这是一种特殊的 IEnumerable<TElement>
. 有什么特别之处?它有一个 Key
相关联。
不,这不是有效的C#语法。
interface IGrouping<out TKey, out IEnumerable<TElement>>
记住,这是一个接口 声明以及在 <>
它声明了接口的类型参数,也就是标识符。IEnumerable<TElement>
不是一个有效的标识符。你似乎还想引用现有的接口--------------。System.Collections.Generic.IEnumerable<T>
但把它放在声明中的这个位置是没有意义的,就像在声明中写下 interface Foo<List<T>>
作为Java中的接口声明。
如果你的意思是
interface IGrouping<out TKey, out TElement> where TElement : IEnumerable
那就是... 可以 的工作,而且有很多方法可以设计这个。IGrouping
接口。下面的方式可能是你最有意义的?
interface IMyGrouping<TKey, TElement> {
TKey Key { get; }
IEnumerable<TElement> Elements { get; }
}
但是,.NET框架的设计真正伟大的地方在于它 实现了一个现有的接口这使得它可以作为一个 IEnumerable<TElement>
直接实现,这是一个非常强大的东西。如果你的类有接口承诺的能力,就实现这个接口。也请看.
下面的意思是GroupBy使用的ILookup有多个键与多个值的关联吗?
是的,因为 ILookup
实施 IEnumerable<IGrouping>
和 IGrouping
实施 IEnumerable
, ILookup
是 一种 像 IEnumerable<IEnumerable>
(原谅我在这里使用了非常宽泛的属相符号)。所以一个 ILookup
枚举的枚举,即像一个二维数组。不同的是: 每个内部 "数组 "都有一个 Key
,因为内部的 "数组 "实际上就是 IGrouping
s.