簡體   English   中英

如何接口 IGrouping<out tkey, out telement> 產生多個值?</out>

[英]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實現了IEnumerableILookup有點IEnumerable<IEnumerable> (請原諒我在這里非常松散地使用了 generics 表示法)。 因此, ILookup是一個可枚舉的可枚舉,即像一個二維數組。 不同之處在於,每個內部“數組”都有一個Key ,因為內部“數組”實際上是IGrouping

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM