接口 IGrouping<out TKey, out TElement> 如何产生多个值?

How can interface IGrouping<out TKey, out TElement> yield multiple values?

不知道我忽略了什么。 IGrouping<out TKey, out TElement> 由 LINQ GroupBy 使用。此外,相同的逻辑适用于 ILookup,IIRC。因此,他们可以 return 受指定键约束的多个值。但是,相反,我希望完成以下签名。

interface IGrouping<out TKey, out IEnumerable<TElement>>
                                  ^^^^^^^^^^^^^

最初,它实现了 IEnumerable<TElement>IEnumerable 以实现向后兼容。这是否完成了相同的任务?如果是,如何?没看懂。

public interface ILookup<TKey,TElement> : IEnumerable<IGrouping<TKey,TElement>>

后面的意思是Join/GroupJoin使用的ILookup有多个键和多个值的关联吗?你能举例说明吗?我看过 the question,但不明白其中的区别,只是它们的惰性求值与即时求值语义不同。


不把事情搞得更复杂,但输出可能对每个人都有帮助。

如果您查看 IGrouping

的声明
public interface IGrouping<out TKey,out TElement> : System.Collections.Generic.IEnumerable<out TElement>

你可以看到它说“IGrouping<TKey, TElement> is a kind of 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 Framework 的设计真正伟大之处在于它 实现了一个现有的接口 ,这使得它可以直接用作 IEnumerable<TElement>,这是一个非常强大的东西。如果您的 class 具有接口所承诺的能力,请实现该接口。 See also.

Does the followed mean ILookup used by GroupBy has multiple keys with the association of multiple values?

是的。由于 ILookup 实现了 IEnumerable<IGrouping>,而 IGrouping 实现了 IEnumerable,因此 ILookup 的一种 ,类似于 IEnumerable<IEnumerable>(请原谅我在这里非常松散地使用泛型符号)。所以一个 ILookup 可枚举的可枚举,即像一个二维数组。 不同的是,每个内层"array"都有一个Key,因为内层"arrays"实际上是IGrouping