经过广泛搜索后,我仍需要专家建议:
需求非常标准:map int从资源文件的字符串开始,因此本地化工作正常,我们可以轻松地为当前用户语言的下拉列表创建值对列表,并对int值进行反向查找。 const整数在不同的类中定义为static。
所以,这是目前的实施方式,有些东西告诉我它可以更好,值得批评:
public class TLiteralDic : Dictionary<int, string>
{
//Lookup method
public string getLiteral(int key)
{
if (ContainsKey(key)) {
return this[key];
}
return string.Empty;
}
}
在靠近UI层的地方,填充下拉控件的扩展方法定义如下:
public static void fill(this TLiteralDic dic, DropDownList ddlst)
{
ddlst.Items.Clear();
foreach (KeyValuePair<int, string> v in dic) {
ddlst.Items.Add(new ListItem(v.Value, v.Key.ToString()));
}
}
public static class TLiterals
{
private static TLiteralDic _fileStatus;
public static TLiteralDic FileStatus
{
get
{
if (_fileStatus == null) {
_fileStatus = new TLiteralDic() {
{TFiles.Status.Cancelled, Lists.FileStatus_Cancelled},
{TFiles.Status.Closed, Lists.FileStatus_Closed},
{TFiles.Status.OnHold, Lists.FileStatus_OnHold},
{TFiles.Status.Open, Lists.FileStatus_Open},
{TFiles.Status.Pending, Lists.FileStatus_Pending},
{TFiles.Status.Portal, Lists.FileStatus_Portal}
};
}
return _fileStatus;
}
}
//... hundred of lists like that, short and long (up to 15 entries)
}
查找
textStatus.Text = TLiterals.FileStatus.getLiteral(row.FileStatus);
列表填充:
TLiterals.FileStatus.fill(ddlstFileStatus);
这个想法是只有一个地方定义了映射,并且能够从中创建一个列表或者通过int值进行查找。理想情况下具有良好的性能,最小的内存占用和编码麻烦。
已经考虑过以下替代方案:
目前尚未找到简单或明显更好的解决方案。
任何有关更好“美丽代码”的想法? :)
理想情况下,我希望在定义列表时看到类似的内容,但在真正需要/使用之前不应初始化:
public static TLiteralDic FileStatus = new TLiteralDic () {
{TFiles.Status.Cancelled, Lists.FileStatus_Cancelled},
{TFiles.Status.Closed, Lists.FileStatus_Closed},
{TFiles.Status.OnHold, Lists.FileStatus_OnHold},
{TFiles.Status.Open, Lists.FileStatus_Open},
{TFiles.Status.Pending, Lists.FileStatus_Pending},
{TFiles.Status.Portal, Lists.FileStatus_Portal}
}
答案 0 :(得分:0)
在真正需要/使用之前不应该初始化:
您可以使用延迟实例化来执行此操作:
Lazy<Dictionary<string, string>> resources = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));
对字典进行排序还可以帮助您加快搜索速度,例如使用BinarySearch。