2 回答

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

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