一種替代的方法來構建自己的指定CarDictionary
與大致如下(假設Name
字段/屬性是public
)基於字符串的索引:
public class CarDictionary : List<Car>
{
public Car this[string name]
{
get { return this.Single(car => car.Name.Equals(name)); }
set {
var oldCar = this.SingleOrDefault(car => car.Name.Equals(name));
if (oldCar != null) base.Remove(oldCar);
value.Name = name;
base.Add(value);
}
}
public new void Add(Car car)
{
if (this.Any(c => c.Name.Equals(car.Name)))
throw new InvalidOperationException("Dictionary already contains a Car with the same name");
base.Add(car);
}
}
此外,您將需要重新執行或隱藏其他基類方法,如AddRange
,Remove
等,以確保收集不會意外損壞。
如果你現在初始化你的車 「字典」,並添加福特:
var cars = new CarDictionary();
var newCar = new Car("Ford", 4, 2387.4, 4535.7, 128.2);
cars["Ford"] = newCar;
字典狀態是:
Number of cars: 1, name of first car: Ford
如果再嘗試:
cars["Ford"].Name = "not Ford";
字典狀態將爲:
Number of cars: 1, name of first car: not Ford
接下來,使用重新實現Add
方法添加一個新福特:
cars.Add(new Car("Ford", 6, 4000.0, 500.0, 100.0));
將產生以下詞典狀態:
Number of cars: 2, name of last car: Ford
試圖增加另一個福特使用Add
方法將產生一個例外:
var anotherFord = new Car("Ford", 3, 1000.0, 50.0, 120.0);
cars.Add(anotherFord);
InvalidOperationException: Dictionary already contains a Car with the same name
,但如果你使用索引來代替,新福特將取代舊的:
cars["Ford"] = anotherFord;
Number of cars: 2, name of last car: Ford
最後一個特點與使用索引到一個新的Car
添加到字典的是,至於我可以告訴這個
cars["thought this was a Ford?"] = anotherFord;
Number of cars: 3, name of last car: thought this was a Ford?
將是預期的行爲○:索引可能會(?應該)改變加Car
的名字f分度器設定器。如果這種行爲是不希望的,只需從索引器設置器實現中刪除線
value.Name = name;
。
'散列更新'如果你已經存儲在一個散列表...你會怎麼建議這應該工作?這聽起來像一本字典可能不是你想要的結構。 – asawyer 2012-07-30 15:42:38
散列應該是不可變的任何對象。它必須基於定義對象身份的字段。在'Equals(object)'方法中測試的相同。否則不能更改散列,否則將無法在字典中找到您的密鑰。 – Seb 2012-07-30 15:46:31