1

我想知道我忽略了哪一点。IGrouping<out TKey, out TElement>由 LINQ 使用GroupBy。此外,相同的逻辑适用于ILookupIIRC。因此,它们可以根据指定的键返回多个值。但是,相反,我希望以下签名可以这样做。

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

最初,它实现IEnumerable<TElement>IEnumerable向后兼容。这是否完成相同的任务?如果是,如何?我不明白。

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

ILookup使用的后面的意思是否Join/GroupJoin有多个键与多个值的关联?你能举例说明吗?我看过这个问题,但不明白区别,除了他们的惰性评估与立即评估语义。


不再做复杂的事情,但输出可能对每个人都有帮助。

在此处输入图像描述

4

1 回答 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>不是有效的标识符。您似乎还想引用现有的 interface System.Collections.Generic.IEnumerable<T>,但是将其放在声明中的这个位置是没有意义的,interface Foo<List<T>>就像在 Java 中编写为 interface 声明没有意义一样。

如果你的意思是:

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 具有多个键与多个值的关联?

是的。由于ILookupimplementsIEnumerable<IGrouping>IGroupingimplements有点a (IEnumerable请原谅我在这里非常松散地使用泛型符号)。所以一个可枚举的可枚举,即像一个二维数组。不同之处在于,每个内部“数组”都有一个,因为内部“数组”实际上是s。ILookupIEnumerable<IEnumerable>ILookupKeyIGrouping

于 2020-04-23T17:58:57.747 回答