接口 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
。
不知道我忽略了什么。 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
。