System.Collections.Generic.Dictionary `Add` 与 set `Item`

发布于 2024-11-09 02:41:31 字数 282 浏览 0 评论 0原文

如果我希望将项目放入System.Collections.Generic.Dictionary中,我可以Add或设置Item

我知道如果我们执行Add,它会检查密钥是否已经存在,如果不存在,则会抛出异常。

因此,当添加大量项目时,我是否应该更喜欢设置 Item 而不是 Add,因为 Add 会进行不必要的检查,实际上可能会减慢速度?

If i wish to put items into a System.Collections.Generic.Dictionary, I can either Add or set the Item.

I know if we do Add it checks if the key already exists and if not it throws an exception.

So when adding a ton of items, should I prefer setting Item instead of Add, since Add does unnecessary checks that may actually slow things down?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

享受孤独 2024-11-16 02:41:31

这是设置 Item 时发生的情况:

public void set_Item(TKey key, TValue value)
{
    this.Insert(key, value, false);
}

这是添加 item 时发生的情况:

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

最后一个参数 last bool add 参数只会影响这一行:

if (add)
{
    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}

因此,如果您希望在添加重复项时出现异常,则可以需要使用添加。如果你想覆盖现有的项目,你需要设置 Item.

Here is what happens when you set Item:

public void set_Item(TKey key, TValue value)
{
    this.Insert(key, value, false);
}

Here is what happens when you add item:

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

The last parameter last bool add parameter just affects this line:

if (add)
{
    ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}

So if you want exception when you add a duplicate item, you need to use Add. If you want to overwrite exiting item you need to set Item.

橘味果▽酱 2024-11-16 02:41:31

这一切都取决于您是否想要处理重复的键或覆盖任何可能存在的项目。要检查重复项,您可以使用:

例如:

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

Console.WriteLine(dict.ContainsKey(1)); // false
dict[1] = "hi";
dict[1] = "hello"; // "hi" is overwritten

// true: hello
Console.WriteLine("{0}: {1}", dict.ContainsKey(1), dict[1]);

// TryGetValue if checking by key and interested in the value
string result;
if (dict.TryGetValue(1, out result))
{
    Console.WriteLine("Key 1 exists: " + result);
}
else
{
    Console.WriteLine("Key 1 not found");
}

That all depends on whether you want to handle duplicate keys or overwrite any potentially existing item. To check for duplicates you can use:

For example:

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

Console.WriteLine(dict.ContainsKey(1)); // false
dict[1] = "hi";
dict[1] = "hello"; // "hi" is overwritten

// true: hello
Console.WriteLine("{0}: {1}", dict.ContainsKey(1), dict[1]);

// TryGetValue if checking by key and interested in the value
string result;
if (dict.TryGetValue(1, out result))
{
    Console.WriteLine("Key 1 exists: " + result);
}
else
{
    Console.WriteLine("Key 1 not found");
}
帅气称霸 2024-11-16 02:41:31

抛出异常的成本很低,但处理异常的成本却很高。 try/catch 块的 try 部分像平常一样运行。当执行 catch 块时,它必须展开堆栈以填充堆栈跟踪(除其他外)。这就是异常成本高昂的原因。如果您有办法通过使用诸如 Dictionary.ContainsKey 之类的方法来避免捕获异常,这就是避免捕获异常的原因。

您不太可能注意到调用 Add 之间的性能差异和设置项目。因此,请使用最适合具体情况的一种。

更新:
不要优化你的代码,除非它很慢。

Throwing exceptions are cheap, its handling them that is expensive. The try portion of the try/catch block runs like normal. When a catch block is executed, it has to unwind the stack to populate the stack trace (among other things). This is what makes exceptions expensive. This is the reason to avoid catching exceptions if you you have the means to do so by using methods such as Dictionary<T>.ContainsKey

It is highly unlikely that you will ever notice the performance difference between calling Add and setting Item. So use the one that is most appropriate for the situation.

Update:
Don't optimize your code unless it is slow.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文