[英]How can interface IGrouping<out TKey, out TElement> yield multiple values?
我想知道我忽略了哪一点。 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>>
以下是否意味着Join/GroupJoin
ILookup
使用的 ILookup 具有多个键与多个值的关联? 你能举例说明吗? 我看过这个问题,但不明白区别,除了他们的惰性评估与立即评估语义。
不要让事情变得更复杂,但 output 可能对每个人都有帮助。
如果您查看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>>
没有意义一样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>
使用,这是一个非常强大的东西。 如果您的 class 具有接口承诺的能力,请实现该接口。 另请参阅。
以下是否意味着 GroupBy 使用的 ILookup 具有多个键与多个值的关联?
是的。 由于ILookup
实现了IEnumerable<IGrouping>
,而IGrouping
实现了IEnumerable
, ILookup
有点像IEnumerable<IEnumerable>
(请原谅我在这里非常松散地使用了 generics 表示法)。 因此, ILookup
是一个可枚举的可枚举,即像一个二维数组。 不同之处在于,每个内部“数组”都有一个Key
,因为内部“数组”实际上是IGrouping
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.