ホームページ > バックエンド開発 > 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 extends IReadOnlyCollection get インデクサーを使用すると、共分散を維持しながらインデックス付きの取得が可能になります。

両方のリストおよび ReadOnlyCollection (List.AsReadOnly() 経由で取得) これらのインターフェイスを実装して、インデックス サポートを備えた共変コレクションを提供します。

ただし、get インデクサーと set インデクサーの両方を備えた共変コレクションが必要な場合、オプションは限られています。考えられる解決策は、既存の IList をラップすることです。 CovariantList に変換し、他の必要なプロパティを提供しながら get インデクサーのみを公開します。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート