.NET - 字典锁定与 ConcurrentDictionary

我找不到足够的信息ConcurrentDictionary类型,所以我想我在这里问它。 目前,我使用Dictionary为了让所有通过多个线程(从线程池,没有确切的线程)持续访问的所有用户,并且它具有同步的访问权限。 我最近发现,.NET 4.0中有一套线程安全系列,这似乎非常令人愉悦。我想知道,“更有效,更易于管理"选项将是什么,因为我有一个正常的选择Dictionary使用同步访问或具有ConcurrentDictionary这已经是线程安全了。 引用.NET 4.0ConcurrentDictionary 答案 可以以不同的方式查看线程安全收集与非线程安全收集。 考虑一个没有文员的商店,除了结帐时。如果人们不负责任地采取行动,您会有很多问题。例如,假设客户在店员目前正在建造金字塔时从金字塔式罐中拿起一罐,所有地狱都会松散。或者,如果两个客户同时赢得同一商品,谁赢了该怎么办?会打架吗?这是一个非线程安全收集。有很多方法可以避免问题,但是它们都需要某种锁定,或者以某种方式明确访问。 另一方面,请考虑一家商店的店员在桌子上,您只能通过他购物。你排队,问他一个物品,他把它带回你身上,你走了。如果您需要多个物品,则只能记得每个往返上的物品,但您需要小心避免让店员陪伴,这会激怒其他客户在您身后。 现在考虑一下。在商店里有一个店员,如果您一路走到线的前面,问店员"您有厕纸吗?当我知道我需要多少时,请回到你身边。线程安全集合不会阻止这种情况。 线程安全集合可以确保其内部数据结构始终有效,即使从多个线程访问。 非线程安全系列没有任何此类保证。例如,如果您在一个线程上的二进制树上添加了一些东西,而另一个线程则忙于重新平衡树,则不能保证该物品会被添加,或者即使这棵树之后仍然有效,它可能会损坏希望超出希望。 但是,线程安全集合不能保证线程上的顺序操作在其内部数据结构的相同"快照"上工作,这意味着如果您有这样的代码: if (tree.Count > 0) Debug.WriteLine(tree.First().ToString()); you might get a NullReferenceException because inbetween tree.Count和tree.First(),另一个线程清除了树上的其余节点,这意味着First()将返回null。 在这种情况下,您要么需要查看有关集合是否有一种安全的方法来获得所需的东西,也许您需要重写上面的代码,或者您可能需要锁定。 来自: stackoverflow.com

.NET HashTable 与 Dictionary - 字典能一样快吗?

我试图弄清楚何时以及为何使用字典或哈希表。 但我也读过字典并不总是按照插入的顺序返回对象,它是排序的。 我的问题是,这些情况可能是什么? 答案 System.Collections.Generic.Dictionary<TKey, TValue>和System.Collections.Hashtable类都在内部维护哈希表数据结构。None of them guarantee preserving the order of items. 抛开装箱/拆箱问题不谈,大多数时候,它们应该具有非常相似的性能。 它们之间的主要结构差异是Dictionary依靠链接 (为每个哈希表桶维护一个项目列表)来解决冲突,而Hashtable用途重新散列用于冲突解决(当发生冲突时,尝试另一个哈希函数将密钥映射到存储桶)。 使用起来没什么好处Hashtable如果您的目标是 .NET Framework 2.0 ,则为 .NET Framework 2.0 。Dictionary<TKey, TValue>。 来自: stackoverflow.com

.NET 中有可用的只读通用字典吗?

我正在我的只读属性中返回对字典的引用。IList我可以简单地退货AsReadOnly。 Private _mydictionary As Dictionary(Of String, String) Public ReadOnly Property MyDictionary() As Dictionary(Of String, String) Get Return _mydictionary End Get End Property 答案 这是一个包装字典的简单实现: public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue> { private readonly IDictionary<TKey, TValue> _dictionary; public ReadOnlyDictionary() { _dictionary = new Dictionary<TKey, TValue>(); } public ReadOnlyDictionary(IDictionary<TKey, TValue> dictionary) { _dictionary = dictionary; } #region IDictionary<TKey,TValue> Members void IDictionary<TKey, TValue>.Add(TKey key, TValue value) { throw ReadOnlyException(); } public bool ContainsKey(TKey key) { return _dictionary....

.NET 字典中存在重复键?

.NET 基类库中是否有允许使用重复键的字典类? Dictionary<string, List<object>> 但这对于实际使用来说是相当烦人的。 答案 如果您使用的是 .NET 3.5,请使用Lookup班级。 编辑:您通常创建一个Lookup使用Enumerable.ToLookup。 如果说不为你工作,我认为框架中没有任何东西可以帮助 - 并且使用字典是最好的:( 来自: stackoverflow.com

“ setDefault” dict方法的用例

添加collections.defaultdict在Python中2.5大大减少了对dict’setdefault方法。这个问题是为了我们的集体教育: 什么是setdefault今天在Python 2.6/2.7中仍然有用吗? 哪些流行的用例setdefault被取代了collections.defaultdict? 答案 你可以说defaultdict对于设置默认值有用在填写案例之前 和setdefault对于设置默认值有用填充dict或之后。 可能是最常见的用例:分组项目(在未排序的数据中,否则使用itertools.groupby) # really verbose new = {} for (key, value) in data: if key in new: new[key].append( value ) else: new[key] = [value] # easy with setdefault new = {} for (key, value) in data: group = new.setdefault(key, []) # key might exist already group.append( value ) # even simpler with defaultdict from collections import defaultdict new = defaultdict(list) for (key, value) in data: new[key]....

“冻结的dict”将是什么?

冷冻套件是冷冻组。 冷冻清单可能是个元组。 冷冻的命令是什么?不变的,可伸的命令。 我想可能是collections.namedtuple,但这更像是一个冷冻的摩托式(半固定)。不是吗? “冷冻"应该是冰冻的词典,应该有keys,,,,values,,,,get等等,并支持in,,,,for, ETC。 更新 : *是:https://www.python.org/dev/peps/pep-0603 答案 Python没有内置的冷冻类型。事实证明,这不会经常有用(尽管它仍然可能比frozenset是)。 想要这样的类型的最常见原因是,当记忆函数呼吁使用未知参数的函数时。存储相当于dict(值的位置)的最常见解决方案是类似的tuple(sorted(kwargs.iteritems()))。 这取决于排序不是有点疯狂。Python不能积极保证排序将在这里导致合理的事情。(但是它不能承诺太多,所以不要流汗太多。) 您可以很容易地制作某种类似于dict的包装器。看起来像是 import collections class FrozenDict(collections.Mapping): """Don't forget the docstrings!!""" def __init__(self, *args, **kwargs): self._d = dict(*args, **kwargs) self._hash = None def __iter__(self): return iter(self._d) def __len__(self): return len(self._d) def __getitem__(self, key): return self._d[key] def __hash__(self): # It would have been simpler and maybe more obvious to # use hash(tuple(sorted(self._d.iteritems()))) from this discussion # so far, but this solution is O(n)....

“坏词”过滤器

不是很技术性,但是…我必须在我们正在开发的新站点中实现一个错误的单词过滤器。因此,我需要一个"好"坏字列表来用…任何提示 /方向喂养我的数据库?和Google一起环顾四周找到了这个一个,这是一个开始,但仅此而已。 是的,我知道这种过滤器很容易被逃脱了…但是客户将是客户将!!!:-) 该网站将不得不同时滤除英语和意大利语单词,但是对于意大利语,我可以要求我的同事帮助我获得" Parolacce"的社区构建列表:-)-电子邮件将提供。 谢谢你的帮助。 答案 我没有看到指定的任何语言,但是您可以将其用于PHP,它将为每个内部工作生成一个正则拨号,以便甚至有意拼写(即@SS,i3itch)也会被抓住。 <?php /** * @author [email protected] **/ if($_GET['act'] == 'do') { $pattern['a'] = '/[a]/'; $replace['a'] = '[a A @]'; $pattern['b'] = '/[b]/'; $replace['b'] = '[b B I3 l3 i3]'; $pattern['c'] = '/[c]/'; $replace['c'] = '(?:[c C (]|[k K])'; $pattern['d'] = '/[d]/'; $replace['d'] = '[d D]'; $pattern['e'] = '/[e]/'; $replace['e'] = '[e E 3]'; $pattern['f'] = '/[f]/'; $replace['f'] = '(?:[f F]|[ph pH Ph PH])'; $pattern['g'] = '/[g]/'; $replace['g'] = '[g G 6]'; $pattern['h'] = '/[h]/'; $replace['h'] = '[h H]'; $pattern['i'] = '/[i]/'; $replace['i'] = '[i I l !...

[]和{} vs list()和dict(),哪个更好?

我知道他们都是本质上是一样的,但在风格方面,这是更好的(更多的神谕的)一个用来创建一个空列表或dict吗? 答案 就速度而言,它与空列表/字典没有竞争: >>> from timeit import timeit >>> timeit("[]") 0.040084982867934334 >>> timeit("list()") 0.17704233359267718 >>> timeit("{}") 0.033620194745424214 >>> timeit("dict()") 0.1821558326547077 对于非空: >>> timeit("[1,2,3]") 0.24316302770330367 >>> timeit("list((1,2,3))") 0.44744206316727286 >>> timeit("list(foo)", setup="foo=(1,2,3)") 0.446036018543964 >>> timeit("{'a':1, 'b':2, 'c':3}") 0.20868602015059423 >>> timeit("dict(a=1, b=2, c=3)") 0.47635635255323905 >>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]") 0.9028228448029267 另外,使用括号表示法可以让您使用列表和字典理解,这可能是足够的理由。 来自: stackoverflow.com

Ansible:无法访问字典值 - 出现错误:“dict object”没有属性

--- - hosts: test tasks: - name: print phone details debug: msg="user {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})" with_dict: "{{ users }}" vars: users: alice: "Alice" telephone: 123 当我运行此剧本时,出现以下错误: One or more undefined variables: 'dict object' has no attribute 'name' 这个实际上工作得很好: debug: msg="user {{ item.key }} is {{ item.value }}" 我缺少什么? 答案 这不是完全相同的代码。users,你有几个命令。 就你而言,你有两个字典,但只有一把钥匙(alice, 或者telephone)与"Alice"的相应值,123。 你宁愿这样做: - hosts: localhost gather_facts: no tasks: - name: print phone details debug: msg="user {{ item....

Argument Exception Item with Same Key has already been added

我不断收到以下代码的错误: Dictionary<string, string> rct3Features = new Dictionary<string, string>(); Dictionary<string, string> rct4Features = new Dictionary<string, string>(); foreach (string line in rct3Lines) { string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); rct3Features.Add(items[0], items[1]); ////To print out the dictionary (to see if it works) //foreach (KeyValuePair<string, string> item in rct3Features) //{ // Console.WriteLine(item.Key + " " + item.Value); //} } 该错误引发ArgumentException说, “已添加具有相同密钥的项目。” 经过几次谷歌搜索后我不确定如何解决这个问题。 稍后在代码中我需要访问字典以进行比较函数: Compare4To3(rct4Features, rct3Features); public static void Compare4To3(Dictionary<string, string> dictionaryOne, Dictionary<string, string> dictionaryTwo) { //foreach (string item in dictionaryOne) //{ //To print out the dictionary (to see if it works) foreach (KeyValuePair<string, string> item in dictionaryOne) { Console....

ASP.NET MVC与字典结合

我正在尝试将MVC中的字典值绑定。 在行动中,我有: model.Params = new Dictionary<string, string>(); model.Params.Add("Value1", "1"); model.Params.Add("Value2", "2"); model.Params.Add("Value3", "3"); 在视图中,我有: @foreach (KeyValuePair<string, string> kvp in Model.Params) { <tr> <td> <input type="hidden" name="Params.Key" value="@kvp.Key" /> @Html.TextBox("Params[" + kvp.Key + "]") </td> </tr> } 但是,该视图不会显示初始值,并且当表单提交时Params属性是空的? 答案 你应该看看 scott hanselman 的这篇文章:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx 默认活页夹只能以格式了解字典: params[0].key = kvp.key params[0].value = kvp.value 参数的索引必须是顺序的,从0到没有任何间隙。当前的帮助者不支持这一点,因此您应该自己创建表单输入字段。 您当然可以像这样实现自己的活页夹:http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/ 来自: stackoverflow.com

attributeError:'str'对象没有属性'项目'

在以下代码中: #!/usr/local/bin/python import json APPLICATION_NAME = 'cc9226315643df89-36bf02429075329d0ba36748360d050c' HEADERS1 = json.dumps(dict(Destination = u"/api/af/latest/applications/%s/rulesets" % (APPLICATION_NAME))) print "Headers1 is %s" % (HEADERS1) HEADERS2 = {'Destination': '/api/af/latest/applications/%s/rulesets' % (APPLICATION_NAME)} print "Headers2 is %s" % (HEADERS2) 我得到以下输出: Headers1 is {"Destination": "/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets"} Headers2 is {'Destination': '/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets'} 但是,当我尝试使用Request()中的REST调用中使用Header1或Header2时,我会得到非常不同的结果: SERVER_URL = 'http://1.1.33.109:8087%s' % (APP_PATH) REQ_DATA = None print "Headers are: ", HEADERS print "SERVER_URL is: ", SERVER_URL print "Request Data is:", REQ_DATA print "" RESPONSE = requests.request( 'MOVE', SERVER_URL, auth = ('admin', 'admin'), verify = False, data = REQ_DATA, headers = HEADERS1 ) #<-- If I use HEADER1 it breaks, if I use HEADER2 it works print "Move Ruleset back to the Application RESULT: %s\n" % (RESPONSE) 我在header1中获得以下内容:...

AttributeError:解析 JSON 字典值时,“unicode”对象没有属性“值”

我有以下 JSON 字典: { u'period': 16, u'formationName': u'442', u'formationId': 2, u'formationSlots': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0], u'jerseyNumbers': [1, 20, 3, 15, 17, 5, 19, 6, 18, 25, 10, 2, 4, 12, 16, 22, 24, 34], u'playerIds': [23122, 38772, 24148, 39935, 29798, 75177, 3860, 8505, 26013, 3807, 34693, 18181, 4145, 23446, 8327, 107395, 29762, 254558], u'captainPlayerId': 29798, u'startMinuteExpanded': 0, u'endMinuteExpanded': 82, u'formationPositions': [{u'horizontal': 5....

c

我已经创建了字典对象 Dictionary<string, List<string>> dictionary = new Dictionary<string,List<string>>(); 我想将字符串值添加到给定单个键的字符串列表中。List<string>不是预定义的,我的意思是我没有创建任何列表对象然后提供给dictionary.Add("key",Listname)。dictionary.Add("key",Listname)然后将字符串添加到此列表中。dictionary.Add说明,我还必须定义此列表的内容吗? 谢谢你! 答案 Update: 使用检查是否存在TryGetValue在有列表的情况下仅进行一次查找: List<int> list; if (!dictionary.TryGetValue("foo", out list)) { list = new List<int>(); dictionary.Add("foo", list); } list.Add(2); Original: var dictionary = new Dictionary<string, List<int>>(); if (!dictionary.ContainsKey("foo")) dictionary.Add("foo", new List<int>()); dictionary["foo"].Add(42); dictionary["foo"].AddRange(oneHundredInts); 或者List<string>就像你的情况一样。 顺便说一句,如果您知道要添加到动态集合中的项目数量,例如List<T>,支持采用初始列表容量的构造函数:new List<int>(100);。 这将获取满足指定容量所需的内存预先,而不是每次开始填满时都抓取小块。 来自: stackoverflow.com

C

我正在尝试创建一种从字典中随机返回卡片名称的方法。 我的字典:第一个定义的卡名称是字符串,第二个是该卡的值,它是整数。 public static Dictionary<string, int> _dict = new Dictionary<string, int>() { {"7", 7 }, {"8", 8 }, {"9", 9 }, {"10", 10 }, {"J", 1 }, {"Q", 1 }, {"K", 2 }, {"A", 11 } }; 方法:random是一个随机生成的整数。 public string getCard(int random) { return Karta._dict(random); } 所以问题是: 无法从"int"转换为"string" 有人帮助我我应该如何正确地获得名字? 答案 如果需要根据索引提取元素键,可以使用此函数: public string getCard(int random) { return Karta._dict.ElementAt(random).Key; } 如果需要提取元素值等于随机生成的整数的Key,可以使用以下函数: public string getCard(int random) { return Karta._dict.FirstOrDefault(x => x.Value == random)....