词典是如何进行内部维护的?
当我说 时 Dictionary 它等于两个不同的数组,例如: int[] keys =new int[] { 1, 2, 3 }; string[] values=new string[]{"val1","val2","val3"}; 解决方案 这还不太遥远.查看反射器中的源代码,似乎使用了三个内部集合: private Entry[] entries; private KeyCollection keys; private ValueCollection values; 请注意,还有一个int[] buckets变量可以跟踪这些变量的目的都应该是相当不言自明的.无论如何,这并不是特别奇怪,因为Dictionary类已知并记录在(理想情况下,每个存储桶中有一项)O(1)查找时间. 其他解决方案 所有这些都清楚地写在 mssdn : 字典
0 2024-04-15
编程技术问答社区
螺纹安全词典式系列带上限
我是在具有以下属性的集合之后: 线程安全:它将在ASP.NET中使用,多个客户可以尝试同时添加,删除和访问成员 最大元素:我希望能够在施工时间设置上限,最大元素 tryadd :一种与BlockingCollection.TryAdd(T)相同的方法是完美的,即,如果达到最大元素数量,它将返回false 字典样:在大多数其他方面,A ConcurrentDictionary是完美的,即能够通过钥匙识别元素的能力,删除任何项目(不仅是第一个或最后一个,我认为这会是BlockingCollection) 的限制 在我尝试滚动之前,我的问题是: 我是否错过了一种内置类型,它可以在集合中的元素数量上放置安全的天花板? 有没有办法以BlockingCollection以某种方式实现此功能? 最后,如果我确实需要尝试自己制作,我应该考虑哪种方法?它和locks的包装Dictionary一样简单吗? 示例使用: 聊天室的参与者数量有限限制,可以存储参与者的
0 2024-04-15
编程技术问答社区
C#: Dictionary<K,V>如何在没有Add(KeyValuePair<K,V>)的情况下实现ICollection<KeyValuePair<K,V>?
看System.Collections.Generic.Dictionary,它清楚地实现了ICollection>,但没有所需的" void Add(KeyValuePair item)"函数. 尝试初始化Dictionary时也可以看到这一点: private const Dictionary PropertyIDs = new Dictionary() { new KeyValuePair("muh", 2) }; 失败 没有用于"添加" take'1'参数的超载 为什么这样? 解决方案 预期的API是通过两个参数Add(key,value)方法(或this[key] indexer)添加;因此,它使用显式接口实现来提供Add(KeyValuePair
0 2024-04-15
编程技术问答社区
如何将元组作为字典中的键来使用 C#
我有一个字典fieldTracker,该字典将Tuple作为键,而string作为值.但是,我似乎找不到访问该值的正确方法.这是我当前的代码: for (int i = 0; i (i, j), ""); } dict[(1,1)] = "Hello"; 我已经在Microsoft文档中搜索了一些,但是找不到此问题的键. 解决方案 dict[Tuple.Create(1, 1)] = "Hello"; 或c#7 var dict = new Dictionary(); for (int i = 0; i
0 2024-04-15
编程技术问答社区
是Dictionary坏了还是GetHashCode()应该只基于不可变的成员?
当对象添加到.net system.collections.generic.generic.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary 类,键的哈希码在内部存储,用于以后的比较.当HashCode初始插入字典后更改时,它通常会变得"无法访问",并且当存在检查(即使使用相同的参考)返回False(下面的示例代码)时,可能会使用户感到惊讶. . gethashcode 文档 > 只要对对象状态没有修改来确定对象的equals方法的返回值,就必须始终返回对象的GethashCode方法. . 因此,根据GetHashCode文档,每当平等 - 确定状态已更改,但是Dictionary实现不支持此. 当前的.NET字典实现是否损坏,因为它错误地忽略了哈
0 2024-04-15
编程技术问答社区
是Dictionary坏了还是GetHashCode()应该只基于不可变的成员?
当对象添加到.net system.collections.generic.generic.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary.dictionary 类,键的哈希码在内部存储,用于以后的比较.当HashCode初始插入字典后更改时,它通常会变得"无法访问",并且当存在检查(即使使用相同的参考)返回False(下面的示例代码)时,可能会使用户感到惊讶. . gethashcode 文档 > 只要对对象状态没有修改来确定对象的equals方法的返回值,就必须始终返回对象的GethashCode方法. . 因此,根据GetHashCode文档,每当平等 - 确定状态已更改,但是Dictionary实现不支持此. 当前的.NET字典实现是否损坏,因为它错误地忽略了哈
0 2024-04-15
编程技术问答社区
在C#字典中查找或插入只有一次查询的数据
我是以前的C ++/STL程序员,试图使用C#/.网络技术来代码快速行进算法... 我正在寻找相当于stl方法map::insert在给定密钥处插入一个值的等效词,如果不存在,则将迭代器返回到现有的键值对. 我发现的唯一方法可以使用两个查找:一个内部TryGetValue,另一个在Add中: List list; if (!_dictionary.TryGetValue (pcost, out list)) { list = new List(); dictionary.Add (pcost, list); } list.Add(new Point { X = n.x, Y = n.y }); 有什么可以解释为什么使用.NET容器无法使用的?还是我错过了一些观点? 解决方案 您可以通过以下方式分配您的值: var dict = new Dictionary(); dict[2] = 11;
0 2024-04-15
编程技术问答社区
如何将一个字典转换为一个 ConcurrentDictionary?
我已经看过如何转换 concurrentDictionary ,但是我有一个词典,想转换为同时介绍.我该怎么做?...更好的是,我可以将链接语句设置为同意吗? var customers = _customerRepo.Query().Select().ToDictionary(x => x.id, x => x); 解决方案 使用 ConcurrentDictionary Constructor (IEnumerable>)构造函数>/p> Dictionary dictionary = new Dictionary(); dictionary.Add(1,"A"); dictionary.Add(2, "B"); ConcurrentDictionary concurrentDictionary =
0 2024-04-14
编程技术问答社区
按月分组列表
我有带有DateTime对象的列表.我想按月进行分组,并将其添加到字典中. 因此,在分组过程之后,我想每月和年度清单. 例如: 分组之前 [在元素下方混合] 分组后: 1)2015年1月-5个要素 2)2015年2月-2个元素 2)2014年1月-2个元素 我尝试过这样的尝试: var test = this.myList.GroupBy(x => x.myDate.Month).ToList(); 但是我需要使用字典.您有任何想法如何解决吗? 解决方案 LINQ提供了将结果转换为字典的选项: myList.GroupBy(x => new {Month = x.myDate.Month, Year = x.myDate.Year}) .ToDictionary(g => g.Key, g => g.Count()) 请注意,这将为您提供{Month=1,Year=2015}的形式的键.如果您想要一个字符串,例如January 2
0 2024-04-14
编程技术问答社区
这种非锁定的TryGetValue()字典访问是否是线程安全的?
private object lockObj = new object(); private Dictionary dict = new Dictionary(); public string GetOrAddFromDict(int key) { string value; // non-locked access: if (dict.TryGetValue(key, out value)) return value; lock (this.lockObj) { if (dict.TryGetValue(key, out value)) return value; string newValue = "value of " + key; // place long operation here di
0 2024-04-14
编程技术问答社区
加载一个.csv文件到字典中,我一直得到错误 "不能从'string[]'转换到'string'"
我已经使用StreamReader在.csv文件中读取,然后我需要将值分开并将其放入字典中.到目前为止,我有: namespace WindowsFormsApplication2 { public partial class Form1 : Form { Dictionary dict = new Dictionary(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { using (StreamReader reader = new StreamReader("textwords0.csv")) { string line; whi
0 2024-04-14
编程技术问答社区
按值 "分组 "字典
我有一个字典:Dictionary.我想获得新的词典,其中原始字典的键表示为List.这就是我的意思: var prices = new Dictionary(); prices包含以下数据: 1 100 2 200 3 100 4 300 我想获得IList>>: int List 100 1,3 200 2 300 4 我该怎么做? 解决方案 var prices = new Dictionary(); prices.Add(1, 100); prices.Add(2, 200); prices.Add(3, 100); prices.Add(4, 300); Dictionary> test =
0 2024-04-14
编程技术问答社区
如何将一个字典转换为一个查询?
我有一个具有签名的字典:Dictionary>.我想将其转换为具有签名的查找:Lookup. 我尝试了: Lookup loginGroups = mapADToRole.ToLookup(ad => ad.Value, ad => ad.Key); 但是效果不佳. 解决方案 您可以使用: var lookup = dictionary.SelectMany(p => p.Value .Select(x => new { p.Key, Value = x})) .ToLookup(pair => pair.Key, pair => pair.Value); (您可以使用KeyValuePair而不是匿名类型 - 我主要不是出于格式化原因.)
0 2024-04-14
编程技术问答社区
C#定义具有自定义键的哈希集
我在C#中使用HashSet和Dictionary来实现图形结构.当HashSet键是自定义类时,我的唯一性有问题.我有: public class Point { public int x { get; set; } public int y { get; set; } } public class Vertex { public Vertex(Point point) { VertexLabel = point; } public Point VertexLabel { get; private set; } } public class Edge { public Edge(Vertex to, Vertex from, double weight) { FromVertex = from; ToVertex = to; Weight = we
0 2024-04-14
编程技术问答社区
.NET二进制序列化在Dictionary<Key, Value>上的奇怪行为
我遇到了一个,至少出于我的期望,在.net的二进制序列化中奇怪的行为. 在OnDeserialization回调之后,加载的所有Dictionary的所有项目都会添加到其父级.相反,List也是如此.在现实世界存储库代码中,这确实很烦人,例如,当您需要在字典项目中添加一些委托时.请检查示例代码并观看断言. 是正常行为吗? [Serializable] public class Data : IDeserializationCallback { public List List { get; set; } public Dictionary Dictionary { get; set; } public Data() { Dictionary = new Dictionary { { "hello", "hello" }, { "CU", "
0 2024-04-14
编程技术问答社区
寻找两本字典之间的差异
是否有LINQ方法可以找到两个通用字典之间的差异? 与这个问题,但带有通用词典. 解决方案 var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne)); 其他解决方案 如果性能很重要,则可能需要使用字典类的散布查找并提高速度.我进行了一个带有100万个条目的词典的测试场景,对其进行了深刻的启动,并将10个编辑(删除了5个条目,添加了5个条目). [我有一项任务要做,涉及寻找数据更改,然后仅将更改推向另一个功能.] 使用Linq(请参阅Magnus的答案)根据秒表的时间约为3600ms.通过使用dictionary.contains()的简单比较,经过的时间约为600ms.环境是视觉工作室2017社区,以调试模式为ConsoleApp测试安全带,在同一台机器上. 您的里程可能会有所不同,并且您可能有很多线路,因此可能并不重要,但是对于使用字典类的查找功能,较大的词典. 在下面的示例中,dic
0 2024-04-14
编程技术问答社区
如何将XML文件内容映射为C#对象
我是C#的新手,我正在尝试读取XML文件并将其内容传输到C#对象. 例如. XML文件的示例可能是: Person 1 21 Person 2 22 ..可以映射到C#类的数组,称为"人": Person[] people; 一个人对象可以包含以下字段: string name; uint age; 解决方案 听起来您想使用XML序列化.那里已经有很多,但这是一个非常简单的例子. 您想要的片段大约是向下的1/4: XmlSerializer deserializer = new XmlSerializer(typeof(List)
0 2024-04-14
编程技术问答社区
用foreach对Dictionary进行迭代,这要按什么顺序进行?
说我有一个Dictionary,我以特定顺序添加每个key和value条目. 现在,如果我以后能够在相同的顺序条目中迭代此Dictionary,那是我在此词典上使用简单的foreach循环所获得的顺序吗? 如果没有,我将很高兴听到我该怎么做,我知道可以用List而不是Dictionary轻松完成,但我不想这样做. 谢谢 解决方案 正常Dictionary不保证项目的顺序. 您需要另外,如果O(log n)查找良好并且应该对键进行排序 - sortedDictionary . 其他解决方案 听起来您想要的是Queue:按照您想要的顺序添加您的KeyValuePair项目,然后foreach将以第一/首先订单为单位. 其他解决方案 Dictionary是哈希表,这意味着您不能保证迭代对以相同的顺序返回它们. 每对都是KeyValuePair,因此您可以拥有一个List
0 2024-04-14
编程技术问答社区
如何正确使用IReadOnlyDictionary?
来自 msdn : 表示密钥/值对的一般读取集合. 但是请考虑以下: class Test { public IReadOnlyDictionary Dictionary { get; } = new Dictionary { { "1", "111" }, { "2", "222" }, { "3", "333" }, }; public IReadOnlyList List { get; } = (new List { "1", "2", "3" }).AsReadOnly(); } class Program { static void Main(string[] args) { var test = new Test();
0 2024-04-14
编程技术问答社区
如何得到ToDictionary()失败的重复键?
我使用IEnumerable's ToDictionary()扩展方法创建了一个字典对象: var dictionary = new Dictionary (myCollection.ToDictionary(k => k.Key)); 执行时,它会抛出以下ArgumentException: 已经添加了具有相同密钥的项目. 我该如何告诉我重复的键是什么? 解决方案 获取副本键: var duplicateKeys = myCollection .GroupBy(k => k.Key) .Where(g => g.Count() > 1) .Select(g => g.Key); 其他解决方案 如果您的特定情况可以仅在字典中插入一组具有重复Key属性的对象之一,则可以完全使用linq Distinct方法,然后再调用Distinct C5>. var dict
0 2024-04-14
编程技术问答社区