首頁 > 後端開發 > C++ > 如何在C#中透過索引尋找實現協變集合?

如何在C#中透過索引尋找實現協變集合?

Susan Sarandon
發布: 2024-12-31 08:07:10
原創
735 人瀏覽過

How Can I Achieve Covariant Collections with Index Lookup in C#?

協變和IList:擴展索引查找的集合

在C# 中,協變集合允許使用子集合從父集合中檢索專案.然而,標準 IEnumerable支援協方差的介面缺乏直接索引查找功能。

Since List;實作ICollection使用Add 方法,直接將其轉換為IList;將允許無限制地添加任何動物類型,從而違反了原始List 的限制。

為了解決此問題,.NET 4.5 及更高版本引入了 IReadOnlyList;和 IReadOnlyCollection,它們都是協變的。 IReadOnlyList擴充 IReadOnlyCollection;使用 get 索引器,允許索引檢索,同時保持協方差。

兩個清單;和 ReadOnlyCollection (透過 List.AsReadOnly() 取得)實作這些接口,提供具有索引支援的協變集合。

但是,如果您需要同時具有 get 和 set 索引器的協變集合,則選項是有限的。一個可能的解決方案是將現有的 IList 包裝起來。到CovariantList 中,它隻公開取得索引器,同時提供其他必要的屬性:

public static class Covariance
{
    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)
    {
        return new CovariantList<T>(tail);
    }
    private class CovariantList<T> : IIndexedEnumerable<T>
    {
        private readonly IList<T> tail;
        public T this[int index] => tail[index];
        public IEnumerator<T> GetEnumerator() => tail.GetEnumerator();
        public int Count => tail.Count;
    }
}
public interface IIndexedEnumerable<out T> : IEnumerable<T>
{
    T this[int index] { get; }
    int Count { get; }
}
登入後複製

此方法提供了一個同時支援IEnumerable 和IEnumerable 的協變集合。和索引檢索,同時防止原始集合的意外修改。

以上是如何在C#中透過索引尋找實現協變集合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板