在C#中向字典添加和打印键/值的不同方法?

时间:2013-12-27 16:30:33

标签: c# dictionary

我找不到关于这个主题的相关主题,所以我决定提出一个新问题。我是 C#Dictionary课程的第一步,我有几个基本问​​题。首先,这有什么区别:

Dictionary<int, string> dict = new Dictionary<int, string>();

    dict[1] = "hello";

和这个(如果有的话):

Dictionary<int, string> dict = new Dictionary<int, string>();

    dict.Add(1, "hello");

我的第二个问题是:有没有办法在同一行添加多个条目(如果我可以这样调用一对密钥和值)。像int a, b, c;这样的东西,而不是int a; int b; int c;。或者只能将它们添加到多行:

dict.Add(1, "hello");
dict.Add(2, "hey");

我关于字典输出的最后一个问题是,如果有一种“更好”的方式来打印字典,而不是这样做:

foreach (KeyValuePair<int, string> pair in dict)
    {
        Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
    }

我的意思是“更好”,以便更快地输入和更快地执行。 (我知道它也适用于var,而不是KeyValuePair<>

5 个答案:

答案 0 :(得分:5)

  

<强> 1。这有什么区别:dict[1] = "hello"和此:dict.Add(1, "hello")

是的,使用Add[]索引器属性之间存在差异。

您可以根据需要多次拨打dict[1] = "hello";,但只能拨打dict.Add(1, "hello");一次。否则会抛出ArgumentException已经添加了具有相同密钥的项目。

  

<强> 2。有没有办法在同一行添加多个条目(如果我可以这样调用一对键和值)。

创建Dictionary时,您只能使用集合初始化语法在一行中添加多个项目:

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
{
    { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
    { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}},
    { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}
};

但是,无论如何它都会被编译器转换为Add方法调用:)

阅读How to: Initialize a Dictionary with a Collection Initializer (C# Programming Guide)

  

第3。如果有一种“更好”的方式来打印字典,而不是这样做:

有一种方法可以使用一个行表达式打印字典,但我认为它不是更具可读性,无论如何都会在内部使用foreach循环,所以也不要更快:

 Console.WriteLine(string.Join(Environment.NewLine, dict.Select(x => string.Format("{0}: {1}", x.Key, x.Value))));

答案 1 :(得分:2)

  

首先,此dict[1] = "hello"dict.Add(1, "hello")

之间有何区别

在实践中,没有重大区别。 []是一个索引器,实际上它只是在内部调用Add()。但是,作为索引器,当键中已存在键时,它可以替换该值。

  

我的第二个问题是:有没有办法在同一行添加多个条目(如果我可以这样调用一对密钥和值)

是的,在创建新实例时,您可以提供如下的初始化程序:

new Dictionary<int, string> { { 1, "hello" }, { 2, "world" } }

但是,您应该记住,有时候更多行代码比一行代码更易读。请记住其他开发人员阅读您的代码(以及从现在起2周后自己)。

  

我关于字典输出的最后一个问题是,是否有一种“更好”的方式来打印字典。 ...我的意思是“更好”,以便更快地输入和更快地执行。 (我知道它也适用于var,而不是KeyValuePair<>

  • 同样,你不应该牺牲可读性而不是多行代码。你的代码很好,没有必要让它变得“更好”。
  • 一条非常重要的规则:do not optimize prematurely,即除非确实存在性能问题,否则不关心性能。
  • var对性能没有任何影响。

答案 2 :(得分:1)

  

问:这有什么区别:dict [1] =“你好”和这个:dict.Add(1,“你好”)?

Add和dict [something]背后的逻辑是一样的。

如果您查看Dictionary类源代码,您可以看到它使用相同的Insert方法添加条目:

    public TValue this[TKey key] {
        get {
            // skipped
        }
        set {
            Insert(key, value, false);
        }
    }

    public void Add(TKey key, TValue value) {
        Insert(key, value, true);
    }

它的工作方式相同,只是您可以使用相同的键调用只添加一次。

  

问:是否有“更好”的方式来打印字典,而不是这样做

您可以使用:

        var dict = new Dictionary<int, string>()
        {
            { 1, "asd" },
            { 2, "zxc" },
            { 3, "qwe" }
        };
  

问:有没有办法在同一行添加多个条目(如果我可以这样调用一对密钥和值)。

您可以使用简化语法:

        foreach (var pair in dict)
        {
            Console.WriteLine(pair);
        }

输出是:

[1, asd]
[2, zxc]
[3, qwe]

答案 3 :(得分:1)

前两个片段是等效的,字典中没有键,可以在documentation中找到:

  

与指定键关联的值。如果未找到指定的键,则get操作将引发KeyNotFoundException,并且set操作将使用指定的键创建新元素。

如果密钥存在,Add将抛出:

  

相反,如果具有指定键的值已存在,则Add方法将引发异常。

第二个问题已经回答here

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
{
    { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
    { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}},
    { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}
};

最后一个问题是主观的,虽然使用var,但它可以比你的代码段更简单:

foreach (var entry in dictionary)
    Console.WriteLine("[{0} {1}]", entry.Key, entry.Value); 

答案 4 :(得分:0)

dict[1] = "hello";dict.Add(1, "hello");之间的一个关键区别是dict.Add()如果具有该密钥的项已经存在,则会ArgumentException抛出public static class ExtensionMethods { public static void PrintDictionary<TKey, TValue>(this Dictionary<TKey, TValue> dictionary) { foreach(var kvp in dictionary) { Console.WriteLine("{0}, {1}", kvp.Key, kvp.Value); } } } ,而索引器只会覆盖现有的项目。在我自己尝试之前,我不认为C#有这种行为。

关于您的第二个问题,请参阅此SO question了解详情。构建字典后,您无法使用内置方法一次添加多个项目。其他答案为您提供了一次构建包含多个项目的字典的方法。

对于第三个问题,你正在做的事情和可读性一样好;如果你觉得你经常这样做,你可能想创建一个扩展方法:

dict.PrintDictionary()

然后,您只需拨打{{1}}即可获得所需的输出。