我找不到关于这个主题的相关主题,所以我决定提出一个新问题。我是 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<>
。
答案 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<>
。
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}}即可获得所需的输出。