天道酬勤,学无止境

c# Dictionary: making the Key case-insensitive through declarations

I have a Dictionary<string, object> dictionary. It used to be Dictionary<Guid, object> but other 'identifiers' have come into play and the Keys are now handled as strings.

The issue is that the Guid keys from my source data are coming as VarChar, so now a key of "923D81A0-7B71-438d-8160-A524EA7EFA5E" is not the same as "923d81a0-7b71-438d-8160-a524ea7efa5e" (wasn't a problem when using Guids).

What's really nice (and sweet) about the .NET framework is that I can do this:

Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
    StringComparer.InvariantCultureIgnoreCase);

And that works great. But what about a nested Dictionary? Like the following:

Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet 
    = new  Dictionary<int, Dictionary<string, CustomClass>>();

How would I specify the string comparer on a nested dictionary like this?

评论

When you add an element to the outer dictionary, you'll likely create a new instance of the nested dictionary, add it at this point, making use of the overloaded constructor that takes an IEqualityComparer<TKey>.

_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));


Update 08/03/2017: Anecdotally, I read somewhere (I think in "Writing High-Performance .NET Code") that StringComparer.OrdinalIgnoreCase is more efficient when simply wanting to disregard the case of characters. This, however, is entirely unfounded by myself so YMMV.

You are going to have to initialize the nested dictionaries in order to use them. Just use the code you have above at that point.

Basically, you should have some code like this:

public void insert(int int_key, string guid, CustomClass obj)
{
    if (_customRecordSet.ContainsKey(int_key)
         _customRecordSet[int_key][guid] = obj;
    else
    {
         _customRecordSet[int_key] = new Dictionary<string, CustomClass> 
                                     (StringComparer.InvariantCultureIgnoreCase);
         _customRecordSet[int_key][guid] = obj;
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C#中字符串键类型不区分大小写的字典(Case-INsensitive Dictionary with string key-type in C#)
    问题 如果我有Dictionary<String,...>是否可以使ContainsKey方法不区分大小写? 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 回答1 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 确实是有关的。 解决方案是告诉字典实例不要使用标准的字符串比较方法(区分大小写),而要使用不区分大小写的方法。 这是使用适当的构造函数完成的: var dict = new Dictionary<string, YourClass>( StringComparer.InvariantCultureIgnoreCase); 构造函数需要一个IEqualityComparer,它可以告诉字典如何比较键。 StringComparer.InvariantCultureIgnoreCase提供了一个IEqualityComparer实例,该实例以不区分大小写的方式比较字符串。 回答2 var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); myDic.Add("HeLlo", "hi"); if (myDic.ContainsKey("hello")) Console.WriteLine(myDic["hello"]); 回答3
  • Case-INsensitive Dictionary with string key-type in C#
    If I have a Dictionary<String,...> is it possible to make methods like ContainsKey case-insensitive? This seemed related, but I didn't understand it properly: c# Dictionary: making the Key case-insensitive through declarations
  • 为什么ReSharper为什么要对所有内容都使用'var'?(Why does ReSharper want to use 'var' for everything?)
    问题 我刚刚开始在Visual Studio中使用ReSharper(在关于SO的许多建议之后)。 为了进行试验,我打开了一个最近的ASP.NET MVC项目。 我注意到它建议的第一批也是最常见的事情之一是改为将大部分/所有我的显式声明改为var 。 例如: //From This: MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1); //To This: var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1); 等等,即使是简单类型(例如int , bool等)也是如此。 为什么建议这样做? 我不是来自计算机科学或.NET背景的人,最近才“涉足” .NET开发,所以我真的很想了解正在发生的事情以及它是否有益。 回答1 原因之一是提高了可读性。 哪个更好? Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>(); 或者 var dictionary = new Dictionary<int, MyLongNamedObject>(); 回答2 ReSharper的建议显然是过度使用了var关键字。 您可以在类型明显的地方使用它: var
  • 相当于C#Java HashMap(C# Java HashMap equivalent)
    问题 从Java世界进入C#,是否有等效的HashMap? 如果没有,您会推荐什么? 回答1 字典可能是最接近的字典。 System.Collections.Generic.Dictionary实现System.Collections.Generic.IDictionary接口(类似于Java的Map接口)。 您应该注意一些明显的区别: 添加/获取项目 Java的HashMap具有用于设置/获取项目的put和get方法myMap.put(key, value) MyObject value = myMap.get(key) C#的词典使用[]索引来设置/获取项目myDictionary[key] = value MyObject value = myDictionary[key] null键 Java的HashMap允许空键如果您尝试添加空键,.NET的Dictionary将引发ArgumentNullException 添加重复密钥 Java的HashMap将用新值替换现有值。 如果使用[]索引,则.NET的Dictionary将用新值替换现有值。 如果使用Add方法,它将抛出ArgumentException 。 尝试获取不存在的密钥 Java的HashMap将返回null。 .NET的Dictionary将抛出KeyNotFoundException 。
  • 通用字典不区分大小写的访问(Case insensitive access for generic dictionary)
    问题 我有一个使用托管dll的应用程序。 这些dll之一返回通用字典: Dictionary<string, int> MyDictionary; 该词典包含大小写键。 另一方面,我得到了潜在键(字符串)的列表,但是我不能保证这种情况。 我正在尝试使用键来获取字典中的值。 但是当然,由于我的案例不匹配,因此以下操作将失败: bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue ); 我希望TryGetValue具有MSDN doc中提到的忽略大小写标志,但是看来这对于通用词典是无效的。 有没有一种方法可以在忽略键值的情况下获取该词典的值? 是否有比使用适当的StringComparer.OrdinalIgnoreCase参数创建字典的新副本更好的解决方法? 回答1 在尝试获取值时,无法指定StringComparer 。 如果考虑一下, "foo".GetHashCode()和"FOO".GetHashCode()完全不同,因此没有合理的方法可以在区分大小写的哈希映射上实现不区分大小写的get。 但是,您可以使用以下命令首先创建不区分大小写的字典: var comparer = StringComparer.OrdinalIgnoreCase; var caseInsensitiveDictionary =
  • C#字符串替换为字典(C# String replace with dictionary)
    问题 我有一个字符串,需要在上面进行一些替换。 我有一个Dictionary<string, string> ,其中定义了搜索替换对。 我创建了以下扩展方法来执行此操作: public static string Replace(this string str, Dictionary<string, string> dict) { StringBuilder sb = new StringBuilder(str); return sb.Replace(dict).ToString(); } public static StringBuild Replace(this StringBuilder sb, Dictionary<string, string> dict) { foreach (KeyValuePair<string, string> replacement in dict) { sb.Replace(replacement.Key, replacement.Value); } return sb; } 有更好的方法吗? 回答1 如果数据是标记化的(即“亲爱的$ name $,从$ date $开始,您的余额为$ amount $”),那么Regex可能会有用: static readonly Regex re = new Regex(@"\$(\w+)\$"
  • 为什么字典是“无序的”?(Why is a Dictionary “not ordered”?)
    问题 我已经阅读了这篇文章,以回答这里的许多问题。 但是,这到底是什么意思呢? var test = new Dictionary<int, string>(); test.Add(0, "zero"); test.Add(1, "one"); test.Add(2, "two"); test.Add(3, "three"); Assert(test.ElementAt(2).Value == "two"); 上面的代码似乎按预期方式工作。 那么字典以什么方式被认为是无序的呢? 上面的代码在什么情况下可能会失败? 回答1 好吧,一方面,您不清楚这是插入顺序还是键顺序。 例如,如果您编写以下内容,您期望的结果是什么: var test = new Dictionary<int, string>(); test.Add(3, "three"); test.Add(2, "two"); test.Add(1, "one"); test.Add(0, "zero"); Console.WriteLine(test.ElementAt(0).Value); 您期望“三”还是“零”? 碰巧的是,我认为当前的实现会保留插入顺序,只要您从不删除任何内容即可-但您一定不能依赖于此。 这是一个实施细节,将来可能会改变。 删除也会影响这一点。 例如,您希望该程序的结果是什么? using System
  • 如何序列化字典通过WCF?(How to serialize Dictionary<string, string> through WCF?)
    问题 我有一个数据协定,其数据成员的类型为Dictionary<string, string> 。 生成的Web服务引用将其公开为ArrayOfKeyValueOfstringstringKeyValueOfstringstring[]类型的成员。 有没有人见过这个? 回答1 WCF只对结构进行序列化,因为在线上结束的内容必须足够独立,才能对任何客户端(不仅仅是.NET客户端)有用。 在不同平台上开发的某些客户端可能不会共享“字典”的概念,因此将“字典”序列化为带有有关基础类的隐式知识的表示形式可能会受到很大的限制。 客户端甚至可能不是面向对象的。 字典不仅仅是结构-它还包含行为(例如,当您分配给已经存在的密钥时,您会覆盖该密钥等),并且该行为无法跨越网络。 换句话说,Dictionary和许多其他.NET类型是不可互操作的,因此WCF不会尝试将它们保留在ServiceContract 。 为您的数据设计自定义DataContract可能会更好。 回答2 因为WCF必须将所有内容都转换为XML,所以它必须适合XML ...通常将集合转换为数组。 字典很难被表示为xml,这就是为什么在另一端使用这种类型的原因。 您可以指定SvcUtil.exe以使用特定的集合而不是生成的代理代码中的数组,但是我不确定它是否适用于Dictionary。 我要说的是,您应该避免在此处使用字典
  • 与C#中一样,将TypeScript对象作为字典类型(TypeScript Objects as Dictionary types as in C#)
    问题 我有一些使用对象作为字典的JavaScript代码。 例如,“个人”对象将保留从电子邮件地址中键入的一些个人详细信息。 var people = {<email> : <'some personal data'>}; adding > "people[<email>] = <data>;" getting > "var data = people[<email>];" deleting > "delete people[<email>];" 是否可以在Typescript中对此进行描述? 还是我必须使用数组? 回答1 在较新版本的打字稿中,您可以使用: type Customers = Record<string, Customer> 在旧版本中,您可以使用: var map: { [email: string]: Customer; } = { }; map['foo@gmail.com'] = new Customer(); // OK map[14] = new Customer(); // Not OK, 14 is not a string map['bar@hotmail.com'] = 'x'; // Not OK, 'x' is not a customer 如果您不想每次都键入整个类型注释,也可以创建一个接口: interface
  • PHP函数是否区分大小写?(Are PHP functions case sensitive?)
    问题 我正在研究一些代码,并且发现了对mySQL_fetch_array一些调用。 PHP对函数名称是否区分大小写? 我记得在某处读过这篇文章,但似乎找不到任何参考。 回答1 我在此引用: 注意:函数名称不区分大小写,尽管调用函数通常是一种很好的形式,因为它们出现在声明中。 因此,它看起来像用户定义的函数不区分大小写,在PHP5下区分大小写的函数/对象得到了投票。 回答2 不。 PHP函数不区分大小写。 回答3 TL; DR:类名不区分大小写,但始终使用与声明中相同的大小写(与函数相同)。 同样,实例化定义的大小写不同的类可能会导致自动加载器出现问题。 另外,类名不区分大小写: <?php class SomeThing { public $x = 'foo'; } $a = new SomeThing(); $b = new something(); $c = new sOmEtHING(); var_dump($a, $b, $c); 输出: class SomeThing#1 (1) { public $x => string(3) "foo" } class SomeThing#2 (1) { public $x => string(3) "foo" } class SomeThing#3 (1) { public $x => string(3) "foo" }
  • 字典,其中value是C#中的匿名类型(A dictionary where value is an anonymous type in C#)
    问题 是否可以在C#中创建System.Collections.Generic.Dictionary<TKey, TValue> ,其中TKey是无条件类,而TValue是具有许多属性的匿名类,例如,数据库列名称及其本地化名称。 像这样的东西: new { ID = 1, Name = new { Column = "Dollar", Localized = "Доллар" } } 回答1 您无法直接声明这样的字典类型(有kudges,但是仅出于娱乐和新颖目的),但是如果您的数据来自IEnumerable或IQueryable源,则可以使用LINQ ToDictionary()运算符获得一个从序列元素中投影出所需的键和(匿名键入的)值: var intToAnon = sourceSequence.ToDictionary( e => e.Id, e => new { e.Column, e.Localized }); 回答2 正如itowlson所说,您不能声明这样的野兽,但实际上可以创建一个: static IDictionary<TKey, TValue> NewDictionary<TKey, TValue>(TKey key, TValue value) { return new Dictionary<TKey, TValue>(); } static void
  • 不区分大小写的字典(Case insensitive dictionary)
    问题 我希望我的字典不区分大小写。 我有以下示例代码: text = "practice changing the color" words = {'color': 'colour', 'practice': 'practise'} def replace(words,text): keys = words.keys() for i in keys: text= text.replace(i ,words[i]) return text text = replace(words,text) print text 输出=练习更改颜色 我想要另一个字符串, "practice changing the Color" ,(其中Color以大写Color开头)也要提供相同的输出。 我相信有一种通用的方法可以使用mydictionary[key.lower()]转换为小写字母,但是我不确定如何将其最好地集成到我的现有代码中。 (如果无论如何这将是一种合理,简单的方法)。 回答1 如果我对您的理解正确,并且希望以一种不区分大小写的方式键入字典的键,则一种方法是将dict子类化并重载setter / getter: class CaseInsensitiveDict(dict): def __setitem__(self, key, value): super
  • How to modify key in a dictionary in C#
    How can I change the value of a number of keys in a dictionary. I have the following dictionary : SortedDictionary<int,SortedDictionary<string,List<string>>> I want to loop through this sorted dictionary and change the key to key+1 if the key value is greater than a certain amount.
  • 您将如何在C#中实现“特征”设计模式?(How would you implement a “trait” design-pattern in C#?)
    问题 我知道该功能在C#中不存在,但是PHP最近添加了一个名为Traits的功能,在我开始考虑该功能之前,我一开始觉得这很傻。 假设我有一个称为Client的基类。 Client具有一个名为Name属性。 现在,我正在开发可重复使用的应用程序,该应用程序将被许多不同的客户使用。 所有客户都同意客户应有一个名称,因此该名称属于基本类别。 现在,客户A来了,说他还需要跟踪客户的体重。 客户B不需要体重,但他想跟踪身高。 客户C希望同时跟踪体重和身高。 通过特征,我们可以使“重量”和“高度”特征同时成为特征: class ClientA extends Client use TClientWeight class ClientB extends Client use TClientHeight class ClientC extends Client use TClientWeight, TClientHeight 现在,我可以满足客户的所有需求,而无需在课堂上添加任何额外的绒毛。 如果我的客户以后再回来说:“哦,我真的很喜欢那个功能,我也可以拥有吗?”,我只是更新了类定义以包括额外的特征。 您将如何在C#中完成此任务? 接口在这里不起作用,因为我想要属性和任何关联方法的具体定义,并且我不想为该类的每个版本重新实现它们。 (所谓“客户”,是指雇用我作为开发人员的文字人员,而“客户
  • How do C# Events work behind the scenes?
    I'm using C#, .NET 3.5. I understand how to utilize events, how to declare them in my class, how to hook them from somewhere else, etc. A contrived example: public class MyList { private List<string> m_Strings = new List<string>(); public EventHandler<EventArgs> ElementAddedEvent; public void Add(string value) { m_Strings.Add(value); if (ElementAddedEvent != null) ElementAddedEvent(value, EventArgs.Empty); } } [TestClass] public class TestMyList { private bool m_Fired = false; [TestMethod] public void TestEvents() { MyList tmp = new MyList(); tmp.ElementAddedEvent += new EventHandler<EventArgs
  • DataBinding / WPF C#的常规可观察词典类(General Observable Dictionary Class for DataBinding/WPF C#)
    问题 我正在尝试为C#中的WPF数据绑定创建可观察的字典类。 我在这里从Andy找到了一个很好的示例:WPF中使用字典进行双向数据绑定 据此,我试图将代码更改为以下内容: class ObservableDictionary : ViewModelBase { public ObservableDictionary(Dictionary<TKey, TValue> dictionary) { _data = dictionary; } private Dictionary<TKey, TValue> _data; public Dictionary<TKey, TValue> Data { get { return this._data; } } private KeyValuePair<TKey, TValue>? _selectedKey = null; public KeyValuePair<TKey, TValue>? SelectedKey { get { return _selectedKey; } set { _selectedKey = value; RaisePropertyChanged("SelectedKey"); RaisePropertyChanged("SelectedValue"); } } public TValue SelectedValue {
  • C#中的双向/双向词典?(Two-way / bidirectional Dictionary in C#?)
    问题 我想通过以下方式将单词存储在字典中: 我可以按单词获取单词代码: dict["SomeWord"] -> 123并按单词获取单词代码: dict[123] -> "SomeWord" 这是真的吗? 当然,一种方法是使用两个字典: Dictionary<string,int>和Dictionary<int,string>但是还有另一种方法吗? 回答1 我写了几节简单的课程,让您可以做自己想做的事情。 您可能需要使用更多功能进行扩展,但这是一个很好的起点。 该代码的使用如下所示: var map = new Map<int, string>(); map.Add(42, "Hello"); Console.WriteLine(map.Forward[42]); // Outputs "Hello" Console.WriteLine(map.Reverse["Hello"]); //Outputs 42 定义如下: public class Map<T1, T2> { private Dictionary<T1, T2> _forward = new Dictionary<T1, T2>(); private Dictionary<T2, T1> _reverse = new Dictionary<T2, T1>(); public Map() { this.Forward =
  • 如何使用XmlDocument创建XML文档?(How to create an XML document using XmlDocument?)
    问题 如何创建这样的XML文档? <body> <level1> <level2>text</level2> <level2>other text</level2> </level1> </body> 在C#中使用XmlDocument 回答1 关于什么: #region Using Statements using System; using System.Xml; #endregion class Program { static void Main( string[ ] args ) { XmlDocument doc = new XmlDocument( ); //(1) the xml declaration is recommended, but not mandatory XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration( "1.0", "UTF-8", null ); XmlElement root = doc.DocumentElement; doc.InsertBefore( xmlDeclaration, root ); //(2) string.Empty makes cleaner code XmlElement element1 = doc.CreateElement( string
  • C# Collection was modified; enumeration operation may not execute [duplicate]
    This question already has answers here: Closed 8 years ago. Possible Duplicate: Collection was modified; enumeration operation may not execute HI there, I am create an project estimation program and am getting the following error: C# Collection was modified; enumeration operation may not execute. It is related to using this: I initally declare the diciontary globally with this: Dictionary<int, int> rankings = new Dictionary<int, int>(); The Next Method containing this dictionary does the following: private void getFirstEstimation() { List<int> array = new List<int>(); string strConnection =
  • 在foreach循环中编辑字典值(Editing dictionary values in a foreach loop)
    问题 我正在尝试从字典构建饼图。 在显示饼图之前,我想整理数据。 我要删除所有小于饼图5%的饼图切片,并将它们放入“其他”饼图切片中。 但是我得到一个Collection was modified; enumeration operation may not execute Collection was modified; enumeration operation may not execute在运行时Collection was modified; enumeration operation may not execute异常。 我了解为什么在遍历字典时无法在字典中添加或删除项目。 但是我不明白为什么不能简单地在foreach循环中更改现有键的值。 任何建议:修复我的代码,将不胜感激。 Dictionary<string, int> colStates = new Dictionary<string,int>(); // ... // Some code to populate colStates dictionary // ... int OtherCount = 0; foreach(string key in colStates.Keys) { double Percent = colStates[key] / TotalCount; if (Percent < 0.05