当前位置: 首页 > 知识库问答 >
问题:

包装字典的可读性?

公孙茂学
2023-03-14

我正在构建一个转换器,将翻译保存在字典中,其中第一个字符串是标识符,第二个字符串是翻译后的字符串。

在我看来,字典语法不是很可读,所以我在考虑把我的字典包装成

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...
}

共有3个答案

江曦
2023-03-14

如果可读性只是您的问题,您可以在命名空间声明中使用别名。

using SingleTranslation = KeyValuePair<string,string>;
庄弘业
2023-03-14

您总是可以使用字典以外的东西,比如从列表继承的类,然后在其上添加索引器,这样您仍然可以使用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);
        }                
    }
}

这方面的一个工作示例如下:

弓玉书
2023-03-14

别那么做。直接使用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将字符串和缓冲区转换为可读流。