73 votes

Est-ce que C# ont une façon de me donner un immuable Dictionnaire?

Est-il rien de construit dans le noyau C# bibliothèques qui peut me donner une immuable Dictionnaire?

Quelque chose le long des lignes de Java:

Collections.unmodifiableMap(myMap);

Et juste pour préciser, je ne cherche pas à arrêter les clés / valeurs elles-mêmes d'être changé, juste la structure du Dictionnaire. Je veux quelque chose qui ne parvient pas rapide et fort si l'un de IDictionary du mutateur méthodes sont appelées (Add, Remove, Clear).

51voto

dbkk Points 5305

Non, mais un wrapper est assez triviale:

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    IDictionary<TKey, TValue> _dict;

    public ReadOnlyDictionary(IDictionary<TKey, TValue> backingDict)
    {
        _dict = backingDict;
    }

    public void Add(TKey key, TValue value)
    {
        throw new InvalidOperationException();
    }

    public bool ContainsKey(TKey key)
    {
        return _dict.ContainsKey(key);
    }

    public ICollection<TKey> Keys
    {
        get { return _dict.Keys; }
    }

    public bool Remove(TKey key)
    {
        throw new InvalidOperationException();
    }

    public bool TryGetValue(TKey key, out TValue value)
    {
        return _dict.TryGetValue(key, out value);
    }

    public ICollection<TValue> Values
    {
        get { return _dict.Values; }
    }

    public TValue this[TKey key]
    {
        get { return _dict[key]; }
        set { throw new InvalidOperationException(); }
    }

    public void Add(KeyValuePair<TKey, TValue> item)
    {
        throw new InvalidOperationException();
    }

    public void Clear()
    {
        throw new InvalidOperationException();
    }

    public bool Contains(KeyValuePair<TKey, TValue> item)
    {
        return _dict.Contains(item);
    }

    public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
    {
        _dict.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return _dict.Count; }
    }

    public bool IsReadOnly
    {
        get { return true; }
    }

    public bool Remove(KeyValuePair<TKey, TValue> item)
    {
        throw new InvalidOperationException();
    }

    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
    {
        return _dict.GetEnumerator();
    }

    System.Collections.IEnumerator 
           System.Collections.IEnumerable.GetEnumerator()
    {
        return ((System.Collections.IEnumerable)_dict).GetEnumerator();
    }
}

Évidemment, vous pouvez changer la ce[] setter ci-dessus si vous voulez vous permettent de modifier les valeurs.

26voto

16voto

Dylan Meador Points 1564

Avec la sortie de la .NET 4.5, il y a un nouveau ReadOnlyDictionary classe. Il vous suffit de passer un IDictionary pour le constructeur pour créer l'immuable dictionnaire.

Ici est un utile méthode d'extension qui peuvent être utilisés pour simplifier la création de la readonly dictionnaire.

3voto

David Moles Points 7669

L'open-source PowerCollections bibliothèque comprend la lecture du dictionnaire wrapper (ainsi que la lecture seule des wrappers pour à peu près tout le reste), accessible via un statique ReadOnly() méthode sur l' Algorithms classe.

2voto

Kevin Dente Points 7732

Je ne le pense pas. Il existe un moyen de créer une Liste en lecture seule et en lecture seule Collection, mais je ne pense pas qu'il y a un construit en lecture seule Dictionnaire. Système.ServiceModel a un ReadOnlyDictinoary mise en œuvre, mais son intérieur. Ne serait probablement pas être trop difficile à copier, à l'aide de Réflecteur, ou tout simplement créer votre propre à partir de zéro. Essentiellement, il emballe un Dictionnaire et déclenche lorsqu'un mutateur est appelé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X