Maison > développement back-end > C++ > Comment puis-je réaliser des collections covariantes avec la recherche d'index en C# ?

Comment puis-je réaliser des collections covariantes avec la recherche d'index en C# ?

Susan Sarandon
Libérer: 2024-12-31 08:07:10
original
736 Les gens l'ont consulté

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

Covariance et IList : extension des collections pour les recherches d'index

En C#, les collections covariantes permettent de récupérer des éléments d'une collection parent à l'aide d'une collection enfant. Cependant, la norme IEnumerable l'interface, qui prend en charge la covariance, ne dispose pas de capacités de recherche d'index directe.

Depuis List implémente ICollection avec une méthode Add, en la convertissant directement en IList permettrait l'ajout sans restriction de tout type d'animal, violant les contraintes de la liste d'origine List.

Pour résoudre ce problème, .NET 4.5 et versions ultérieures introduisent IReadOnlyList et IReadOnlyCollection, qui sont tous deux covariants. IReadOnlyList étend IReadOnlyCollection avec un indexeur get, permettant une récupération indexée tout en conservant la covariance.

Les deux List et ReadOnlyCollection (obtenu via List.AsReadOnly()) implémente ces interfaces, fournissant une collection covariante avec prise en charge des index.

Cependant, si vous avez besoin d'une collection covariante avec des indexeurs get et set, les options sont limitées. Une solution potentielle consiste à envelopper le fichier IList dans une CovariantList, qui expose uniquement l'indexeur get tout en fournissant les autres propriétés nécessaires :

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; }
}
Copier après la connexion

Cette approche fournit une collection de covariants qui prend en charge à la fois IEnumerable et récupération indexée, tout en empêchant les modifications involontaires de la collection originale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal