我正在构建一个转换器,将翻译保存在字典中,其中第一个字符串是标识符,第二个字符串是翻译后的字符串。
在我看来,字典语法不是很可读,所以我在考虑把我的字典包装成
class Translation : Dictionary<string,string>{}
然后还有keyvaluepair,比如
class SingleTranslation : KeyValuePair<string,string>
但是KeyValuePair类是密封的(无法继承)。有人对我如何使我的字典更具可读性有什么建议吗?
我最担心的是,当我不得不反复阅读字典的时候
foreach(KeyValuePair<string,string> kvp in _translation)
{
string whatever = kvp.Value;
do stuff...
if(kvp.key)
do stuff..
}
我当然可以在foreach中创建一个名为Identifier的字符串,并将其设置为kvp。钥匙但我更喜欢
foreach(SingleTranslation singleTranslation in _translation)
{
singleTranslation.Identifier ... do stuff...
}
如果可读性只是您的问题,您可以在命名空间声明中使用别名。
using SingleTranslation = KeyValuePair<string,string>;
您总是可以使用字典以外的东西,比如从列表继承的类,然后在其上添加索引器,这样您仍然可以使用translations[“myIndex”]
之类的语法。下面的代码可以优化,但你可以得到这个想法。
public class Translations : List<SingleTranslation>
{
public SingleTranslation this[string identifier]
{
get
{
return this.FirstOrDefault(p => p.Identifier == identifier);
}
set
{
SingleTranslation translation = this.FirstOrDefault(p => p.Identifier == identifier);
if (translation == null)
{
this.Add(value);
}
else
{
translation.Value = value.Value;
}
}
}
}
public class SingleTranslation
{
public SingleTranslation(string identifier, string value)
{
Identifier = identifier;
Value = value;
}
public string Identifier { get; set; }
public string Value { get; set; }
}
示例用法:
public class Program
{
public static void Main()
{
Translations translations = new Translations();
translations.Add(new SingleTranslation("hello", "hola"));
translations.Add(new SingleTranslation("day", "día"));
foreach(SingleTranslation translation in translations)
{
Console.WriteLine("{0}: {1}", translation.Identifier, translation.Value);
}
translations["hello"].Value = "salut";
translations["day"].Value = "jour";
foreach(SingleTranslation translation in translations)
{
Console.WriteLine("{0}: {1}", translation.Identifier, translation.Value);
}
}
}
这方面的一个工作示例如下:
别那么做。直接使用Dictionnary
进行完全访问,或者如果需要更多的控制,则使用组合。
在foreach循环中也使用var
。为此定义自定义类型没有任何价值(当您试图将KeyValuePair
转换为派生类时,它甚至不应该起作用。顺便说一句,这就是它被密封的原因之一。
如果您真的想使用自定义类型,并且不想编写太多自定义代码,那么类似的东西可能适合您:
class Translation
{
public Dictionary<string,string> Data { get } = new Dictionary<string,string>;
}
然后你可以做:
Translation t; // Fill some data...
foreach (var item in t.Data) { … }
这样,您就可以确保在为每种情况使用不同类型时,不会将不正确的字典传递给函数:
void DisplayTranslation(Translation t) { … }
如果需要,可以改进Translation
类,使其不公开内部字典,而是为所需的用法公开适当的成员、属性和接口。
行动时刻 - 包括新词典 以下步骤将演示如何包含新目录: 编辑位于FreeRADIUS配置目录下的用户文件,并确保以下alice条目存在: “alice”Cleartext-Password:=“passme” Mikrotik-Total-Limit = 10240 在调试模式下重新启动FreeRADIUS。重启应该不成功,将显示以下错误消息: /etc/raddb/users[11]: Pa
问题内容: 我想将JSON数据存储在Python Pandas DataFrame中 我的JSON数据是像这样的字典的字典 我这样做是为了将数据放入DataFrame 我明白了 我的问题是我的DataFrame包含字典而不是值。 我想知道如何使用Pandas DataFrame管理多维数据(超过2个维度…这里有3个维度)。 DataFrame中的每个字典都有相同的键。 问题答案: df = pd.
如何包含词典 Isaac有几个MikroTik RouterBOARD(路由器),他希望将每个会话的总字节数(发送和接收)限制为10 MB。 一位朋友告诉他只需在回复中添加Mikrotik-Total-Limit AVP。 让我们跟随Isaac实施这一目标。 我们假设本章中有一个干净的FreeRADIUS安装。 RouterBOARD是MikroTik制造的硬件名称。 有各种RouterBOARD
问题内容: 我需要实现一个可哈希的字典,因此我可以将一个字典用作另一个字典的键。 但是我从一位同事那里得到了一个通知,说“它并不是真正不变的,因此并不安全。您可以使用它,但是它的确使我感到自己像个可悲的熊猫。 因此,我开始环顾四周以创建一个不可变的对象。我没有必要将“ key-dict”与另一个“ key-dict”进行比较。它的唯一用途是用作另一本词典的键。 我想出了以下几点: 我使用以下工具测
假设我有一个(嵌套的)字典,如下所示(注意lists-values): 我正在寻找一种正确的方法来打印这本词典,我使用来完成此操作: 我相信上面的内容更容易阅读,而且可能有python库可以做到这一点。
问题内容: 在使用stream2接口之后,如何将node.js缓冲区转换为Readable流? 问题答案: 使用流化器,您可以使用新的流API将字符串和缓冲区转换为可读流。