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

问题描述 投票:0回答:1

不知道我忽略了哪一点。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 有多个键与多个值的关联?你能举例说明吗?我看了 问题但不明白其中的区别,除了他们的懒惰评估与即时评估语义。


不想让事情变得更复杂,但输出可能对大家有帮助。

enter image description here

c# linq interface igrouping ilookup
1个回答
3
投票

如果你看一下 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,因为内部的 "数组 "实际上就是 IGroupings.

© www.soinside.com 2019 - 2024. All rights reserved.