2016-05-20 17 views
1

Angenommen, ich habe eine Klasse Composite, die aus einem Wörterbuch von Instrumenten und Gewichten aufgebaut ist.Gibt es eine einfache Möglichkeit, ein Dictionary-ähnliches Objekt zu erstellen, das nicht hinzugefügt werden kann, dessen Werte jedoch geändert werden können?

public IReadOnlyDictionary<Instrument, double> Underlyings{ get; private set; } 

public Composite(
    Id id, 
    Currency currency, 
    Dictionary<Instrument, double> underlyings 
    ) 
{ 
    Underlyings= underlyings; 
} 

}

Diese Klasse wird dem Kunden ausgesetzt sind, und ich möchte der Kunde in der Lage sein, die bestehenden Schlüssel Werte innerhalb Underlyings, zu modifizieren, aber nicht neue Schlüssel-Wert-Paare zu Underlyings hinzufügen.

Dann Underlyings eine ReadOnlyDictionary wird nicht funktionieren, da der Client-Code nicht in der Lage sein wird, die Werte für vorhandene Schlüssel zu ändern. Meine Lösung bestand also darin, den Wrapper um ein Wörterbuch von this answer zu nehmen und den Setzer für TValue IDictionary<TKey, TValue>.this[TKey key] so zu modifizieren, dass vorhandene Werte geändert werden können. Aber das scheint eine alberne Lösung zu sein - gibt es einen einfacheren Weg als das Schreiben einer Wrapper-Klasse, um ein Dictionary zu haben, das modifizierbare existierende Schlüssel-Wert-Paare hat, aber nicht neue Schlüssel-Wert-Paare hinzugefügt werden können? Entschuldigung für die sehr simple Frage.

+0

@Damien_The_Unbeliever Entschuldigt, wenn ich Mißverständnis Ihren Vorschlag, aber ich glaube nicht, Eigenschaften funktionieren würde, weil ein Verbund nur eine Sammlung von Instrumenten ist, die nicht von Natur aus ein Gewicht haben. Das Gewicht gehört nur zum Verbund selbst. Die Gewichte für jedes Instrument müssen ständig neu gewichtet werden (oder geändert werden), aber sie sind nicht von Natur aus Eigenschaften der Instrumente selbst - sie existieren nur innerhalb des Kontextes dieser Zusammensetzung. Und es gibt Hunderte von verschiedenen Composites. Wenn das einen Sinn ergab? –

Antwort

1

Nein, es gibt kein Standardwörterbuch, das nur Aktualisierungen erlaubt. Alles oder Nichts.

Wie Sie herausgefunden haben, müssen Sie es selbst erstellen oder eine Implementierung finden, die bereits vorhanden ist. Das Überschreiben der Add und this[] Eigenschaft ist eine Lösung, die für Sie arbeiten könnte.

0

Wie Sie bereits gesagt haben, erstellen Sie einen Wrapper über ein Dictionary oder erben Sie von der Dictionary-Klasse eine Override Add.

0

Kein guter Weg, aber ein Hack. Generieren Sie einen Wrapper um Ihre Daten und verwenden Sie eine ReadOnlyDictionary, die in .NET 4.5 eingeführt wird.

class MyDataWrapper<T> 
{ 
    public T Data { set; get; } 
} 

var dicData = new Dictionary<int, MyDataWrapper<string>>(); 
dicData[0] = new MyDataWrapper<string> { Data = "0" }; 
dicData[1] = new MyDataWrapper<string> { Data = "0" }; 
var myDic = new ReadOnlyDictionary<int, MyDataWrapper<string>>(dic); 

myDic[1].Data = "2"; 

// myDic[1] = new ... compile error 
// myDic.Add() compile error 
1

Sie können ReadOnlyDictionary, verwenden aber eine andere Methode zu ändern Wert von bestimmten Schlüssel liefern. Etwas wie:

Dictionary<KeyType, ValueType> _dictionary; 
public ReadOnlyDictionary<KeyType, ValueType> Dictionary => new ReadOnlyDictionary<KeyType, ValueType>(_dictionary); 

public void ChangeValue(KeyType key, ValueType value) => _dictionary[key].Value = value;