2 回答

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
定義“一次性”類型SmallDict:
? ? public SmallDict<string> smallDict;
? ? public myClass()
? ? {
? ? ? ? smallDict = new SmallDict<string>(bigDict);
? ? }
? ? class SmallDict<TKey>
? ? {
? ? ? ? public readonly Dictionary<TKey, SomeStruct> BigDict;
? ? ? ? public SmallDict(Dictionary<TKey, SomeStruct> bigDict)
? ? ? ? {
? ? ? ? ? ? BigDict = bigDict;
? ? ? ? }
? ? ? ? public string this[TKey key]
? ? ? ? {
? ? ? ? ? ? get => BigDict[key].ElemFromStruct;
? ? ? ? ? ? set {
? ? ? ? ? ? ? ? var obj = BigDict[key];
? ? ? ? ? ? ? ? obj.ElemFromStruct = value;
? ? ? ? ? ? ? ? BigDict[key] = obj;
? ? ? ? ? ? }
? ? ? ? }
? ? }
使用方法如下:
Console.WriteLine(smallDict["key1"]); // Equivalent to printing bigDict[key].ElemFromStruct
smallDict["key1"] = "new value";? ? ? // Equivalent to bigDict[key].ElemFromStruct = "new value"
它只是字典的包裝,因此如果您想要比普通索引更多的方法,則必須手動完成所有管道操作。
通用性
請注意如何SmallDict
僅適用于SomeStruct
...的詞典
我本想編寫一個通用的DictionarySlice類,但任何實際通用性的嘗試都會受到 C# 嚴(yán)格類型系統(tǒng)的阻礙:沒有令人滿意的方法來通用地告訴要對哪個屬性進(jìn)行切片。
可能的解決方案:
將getter和setter作為 lambda 傳遞——當(dāng)然您可以這樣做,請注意,您的 lambda 中的代碼將比實際類中的代碼多。如果您需要對許多不同的屬性進(jìn)行切片,它可能會很有用。
制作泛型類將使用的
SomeStruct
實現(xiàn)——不是非常優(yōu)雅,而且如果您有許多屬性需要切片,則可能非常麻煩。IGetSetElemFromStruct
反射——包含在內(nèi)是為了完整性,但不會對其進(jìn)行擴(kuò)展......
大型結(jié)構(gòu)
避免大型結(jié)構(gòu);更重要的是,避免可變結(jié)構(gòu),這在 C# 中被普遍認(rèn)為是非常糟糕的事情(TM) 。根據(jù)微軟的設(shè)計指南,我的重點是:
一般來說,結(jié)構(gòu)體非常有用,但只能用于不會經(jīng)常裝箱的小型、單一、不可變的值。
set?{????var?obj?=?BigDict[key]; ????obj.ElemFromStruct?=?value; ????BigDict[key]?=?obj; }
請注意,在上面的 setter 中,我獲取了結(jié)構(gòu)的副本,修改它,然后將其復(fù)制回字典......不太好。如果它很大,請幫自己一個忙并使用class
.?然后你可以簡單地寫:
set?{?BigDict[key].ElemFromStruct?=?value;?}
屬性獲取/設(shè)置中的重要操作
這是關(guān)于您作為示例編寫的代碼:
public?virtual?Dictionary<string,?string>?smallDict {????get?=>?bigDict.ToDictionary(x?=>?x.Key,?x?=>?x.Value.ElemFromStruct);???//works?fine
盡可能避開它們。沒有明確的界限說明屬性 getters/setters 中可以包含什么內(nèi)容,但是get
以任何合理的標(biāo)準(zhǔn)來看,在 a 中創(chuàng)建和填充字典都太過分了:想象一下,如果您不得不懷疑每個屬性訪問。
也許根本不使用這個
這個解決方案是我能想到的最好的解決方案,但它很笨重而且不是很有用。您必須根據(jù)您的用例自行判斷,但通常直接訪問/修改bigDict[key].ElemFromStruct
會更好。

TA貢獻(xiàn)1995條經(jīng)驗 獲得超2個贊
如果我理解正確的話,您希望能夠Dictionary<string, SomeStruct>從Dictionary<string, string>. 為此,您需要從字符串 Value 創(chuàng)建該結(jié)構(gòu)的實例。這是可以完成的,但這意味著該SomeStruct值ElemFromStruct在set.
請注意,對于任何屬性,在set方法內(nèi)部,都有一個value與屬性(在本例中)類型相同的可用變量Dictionary<string, string>,它表示傳遞到方法中的項set。這在下面用作value.ToDictionary(...
例如:
public virtual Dictionary<string, string> SmallDict
{
get
{
return BigDict.ToDictionary(x => x.Key, x => x.Value.ElemFromStruct);
}
set
{
BigDict = value.ToDictionary(x => x.Key,
x => new SomeStruct {ElemFromStruct = x.Value});
}
}
但是,如果目的只是提供一種SmallDict從 a獲取 a 的方法BigDict(而不是相反),那么您可以刪除該set方法,因為允許用戶BigDict僅基于a 進(jìn)行設(shè)置可能沒有多大意義每個值對應(yīng)一個字符串SomeStruct:
public virtual Dictionary<string, string> SmallDict
{
get
{
return BigDict.ToDictionary(x => x.Key, x => x.Value.ElemFromStruct);
}
}
- 2 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報