为C#字典中的键和值命名以提高代码可读性

为C#字典中的键和值命名以提高代码可读性,c#,generics,dictionary,C#,Generics,Dictionary,在C#struct中,我们可以通过变量名清楚地知道它的用途。比如说, public struct Book { public string title; public string author; } 然后,我知道b.title是一种字符串,它指的是title 然而,在C#dictionary中,我们只能指定类型 Dictionary<string,string> d 字典d 如何使代码更具可读性,以便字典的键是字符串类型,它指的是标题,值是字符串类型,它指的是

在C#struct中,我们可以通过变量名清楚地知道它的用途。比如说,

public struct Book
{
    public string title;
    public string author;
}
然后,我知道b.title是一种字符串,它指的是title

然而,在C#dictionary中,我们只能指定类型

Dictionary<string,string> d
字典d 如何使代码更具可读性,以便字典的键是字符串类型,它指的是标题,值是字符串类型,它指的是作者?这意味着,其他人在阅读代码时很容易知道d[“J.R.R.Tolkien”]是对字典的错误使用

编辑 @mike z建议使用变量名titletoautor,以提高可读性。但我真正的问题是代码中有嵌套字典。例如

Dictionary<string, Dictionary<string, string>>, 
or even 3 levels   
Dictionary<string, Dictionary<string , Dictionary< string , string[] >>>. 
字典,
甚至3级
字典>。

我们希望在不创建自己的类的情况下保持使用Dictionary的便利性,但同时我们需要一些方法来提高可读性

通过设计,Dictionary是一个键值对,公开的集合被称为这样的集合。如果需要更明确的内容,可以派生自己的自定义词典,或者在自己的类上实现适当的词典接口。您还可以将其实现为一个键控集合,其中提供一个lambda表达式来从数据中派生键。

正如@ScottDorman所建议的,您可以定义一个新类型
TitleAuthorDictionary
,该类型派生自
Dictionary
,如下:

public class TitleAuthorDictionary : Dictionary<string, string>
{
    public new void Add(string title, string author)
    {
        base.Add(title, author);
    }

    public new string this[string title]
    {
        get { return base[title]; }
        set { base[title] = value; }
    }
}

如果不与语言对抗就无法解决的问题,我建议使用文档来解决。标识符作为自我文档的一种形式包含在该类别中

因此,要向此类类型添加自文档,请执行以下操作:

using TitleToAuthor = System.Collections.Generic.Dictionary<
    string, // title
    string  // author
>;
不幸的是,您无法将using指令作为泛型类型参数嵌套,因此使用这样的解决方案会使文件顶部的using指令变得非常难看,但至少编写一次的非常难看的代码会在其左侧创建一个非常可读的别名(确切地显示它的用途)您可以在代码的其余部分中引用,而无需实际创建新的数据类型

另一种方法是简单地创建新的数据类型,从Dictionary继承,例如,如果您对新类型的处理比简单地获取更可读的类型名更多,比如添加对该集合特别有用的方法,或者如果该集合在许多源文件中使用,那么我建议使用此方法(从那时起,您将不得不多次使用相同的指令)

在这种情况下,组合可能比继承(将dictionary存储为成员)更好,因为这样您就可以创建一个更小的子集接口来满足您的需要(并且可能通过只提供对特定容器类型完全有意义的高级函数来少用它)在这种情况下,您将把这个有点难读的通用字典变成一个隐藏的实现细节,它不仅可以更好地读取其类型名称,还可以提供更小的、定制的(不太通用的)方法接口,该接口更具体地处理您的需要。举个简单的例子,允许为键或值指定空字符串可能是错误的。字典不会强制执行此类断言,但您自己设计的将字典用作私有实现细节的接口可以


如果你被字典的键/值参数的可读性绊倒了,问题可能不是字典的可读性,而是特定字典的公开曝光量en您可能不仅关心这些代码的可读性,还关心允许访问它的人做任何他们想做的事情的灵活性,这是一个完整的字典所允许的(包括您可能不希望在更大范围内发生的事情)。毕竟,即使是像
float
这样的类型也很少告诉您它应该做什么,但我们倾向于以这样的方式编写代码,即float要么是类/函数的实现细节,要么只是函数参数/返回类型,就它们的作用而言非常明显。因此,也许最好尝试进行这样的di由于实现细节的清晰性和可读性通常与将在整个代码库中访问的接口的更为公开的部分没有多大关系,所以字典不太可见,更多地涉及私有的实现细节。

您可以将其命名为
d
,比如e> titleToAuthor,但我猜这不是您想要的。谢谢,但不是。事实上,我的目标数据结构是一个嵌套字典。即字典,字典(最外层)变量的命名无法解决问题。如果这些是私有变量,您可以使用XML注释。
using TitleToAuthor = System.Collections.Generic.Dictionary<
    string, // title
    string  // author
>;
TitleToAuthor title_to_author = new TitleToAuthor();