天道酬勤,学无止境

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

您处理从第三方或外部dll提取的字典的机会很少。 使用linq

YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))

回答4

如果您在实例创建过程中没有控制权,可以说您的对象已从json等中删除,则可以创建一个从字典类继承的包装器类。

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
回答5

我遇到了同样的麻烦,我需要在ASP.NET Core控制器中使用区分大小写的字典。

我写了一个扩展方法来解决问题。 也许这对其他人也可能有帮助...

public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
    var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var (key, value) in dictionary)
    {
        resultDictionary.Add(key, value);
    }

    dictionary = resultDictionary;
    return dictionary;
}

要使用扩展方法:

myDictionary.ConvertToCaseInSensitive();

然后使用以下命令从字典中获取一个值:

myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 通用字典不区分大小写的访问(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 =
  • Python基础语法七:元组字典和集合
    1.元组 1.什么是元组 元组是不可变的列表(不支持增删改的操作),元组是有序的(支持下标操作) 元组是容器型数据类型,将()作为容器的标志,多个元素之间用逗号,隔开 元组中的元素的要求和列表一样 1)空元组:() 2)单个元素的元组: Tuple2 = (10,) print(tuple2, type(tuple2)) # (10,) <class 'tuple'> 3)多个元素的元组 tuple4 = (100, 200, 300) tuple5 = 100, 200, 300 2.获取元组中的元素 1.获取单个元素 names = '生活大爆炸', '权利的游戏', '吸血鬼日记', '破产姐妹', '尼基塔' print(names[-2]) 2.切片 names = '生活大爆炸', '权利的游戏', '吸血鬼日记', '破产姐妹', '尼基塔' print(names[1::2]) 3.遍历 for 变量 in 元组 4.其他方式: a. touple6 = (10, 20, 30) x, y, z = touple6 print(x, y, z) num1, num2 = 100, 200 # num1, num2 = (100,200) b. 变量1,变量2,变量3,… =元组 前面的变量的个数小于元组中元组的个数,并且有且只有一个变量前有*
  • 从YYModel源码中可以学到什么:后篇
    前言 上一篇中《从YYModel源码中可以学到什么:后篇》中主要学习了YYModel的源码结构,只是分享了YYModel整体结构。 承接上篇,本文将解读YYModel如何进行JSON模型转换的,接下来一起揭开YYModel的神秘面纱吧! 目录 JSON -> Model Model -> JSON JSON转Model 首先来看JSON是如何转为Model。查看YYModel的接口,提供了一个方法: + (instancetype)yy_modelWithJSON:(id)json; 注意json为id类型,接收三种不同类型参数NSString,NSData,NSDictionay。下面是内部实现: + (instancetype)yy_modelWithJSON:(id)json { NSDictionary *dic = [self _yy_dictionaryWithJSON:json]; return [self yy_modelWithDictionary:dic]; } 方法中调用了一个私有方法_yy_dictionaryWithJSON:,该方法将id类型的json(NSDictionary, NSString, NSData)转为字典。 + (NSDictionary *)_yy_dictionaryWithJSON:(id)json { // 验证json if
  • 为什么字典是“无序的”?(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
  • 如何“完美”地覆盖字典?(How to “perfectly” override a dict?)
    问题 我怎样才能使dict的子类尽可能“完美”? 最终目标是要有一个简单的字典,其中的键是小写的。 似乎应该覆盖一些微小的原语才能完成这项工作,但是根据我的所有研究和尝试,似乎并非如此: 如果我重写__getitem __ / __ setitem__,则get / set不起作用。 我如何使它们工作? 当然,我不需要单独实现它们吗? 我是否在阻止酸洗,我是否需要实现__setstate__等? 我需要repr,update和__init__吗? 我应该只使用mutablemapping(似乎不应该使用UserDict或DictMixin )吗? 如果是这样,怎么办? 这些文档并不完全具有启发性。 这是我的第一次尝试, get()无法正常工作,毫无疑问,还有许多其他小问题: class arbitrary_dict(dict): """A dictionary that applies an arbitrary key-altering function before accessing the keys.""" def __keytransform__(self, key): return key # Overridden methods. List from # https://stackoverflow.com/questions/2390827/how-to
  • .NET词典中的重复键?(Duplicate keys in .NET dictionaries?)
    问题 .NET基类库中是否有任何允许使用重复键的字典类? 我发现的唯一解决方案是创建一个类,例如: Dictionary<string, List<object>> 但这实际上使人恼火。 在Java中,我相信MultiMap可以完成此任务,但是无法在.NET中找到类似物。 回答1 如果您使用的是.NET 3.5,请使用Lookup类。 编辑:您通常使用Enumerable.ToLookup创建一个Lookup 。 这确实假定您以后无需更改它-但我通常会发现它足够好。 如果不为你工作,我不认为有一个在任何框架,这将有助于-并使用字典是尽善尽美:( 回答2 List类实际上对于包含要在集合上进行迭代的重复项的键/值集合非常有效。 例子: List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(); // add some values to the collection here for (int i = 0; i < list.Count; i++) { Print(list[i].Key, list[i].Value); } 回答3 这是使用List <KeyValuePair <string,string>>的一种方法 public class
  • 在C#中合并字典(Merging dictionaries in C#)
    问题 在C#中合并2个或更多词典( Dictionary<T1,T2> )的最佳方法是什么? (像LINQ这样的3.0功能很好)。 我正在考虑以下方法签名: public static Dictionary<TKey,TValue> Merge<TKey,TValue>(Dictionary<TKey,TValue>[] dictionaries); 或者 public static Dictionary<TKey,TValue> Merge<TKey,TValue>(IEnumerable<Dictionary<TKey,TValue>> dictionaries); 编辑:从Jare​​dPar和Jon Skeet得到了一个很酷的解决方案,但是我在想一些处理重复键的方法。 在发生冲突的情况下,只要保持一致,就可以将哪个值保存到字典中。 回答1 这部分取决于您遇到重复时要发生的情况。 例如,您可以执行以下操作: var result = dictionaries.SelectMany(dict => dict) .ToDictionary(pair => pair.Key, pair => pair.Value); 如果您得到任何重复的密钥,将抛出异常。 编辑:如果您使用ToLookup,那么您将获得一个查询,该查询每个键可以具有多个值。 然后,您可以将其转换为字典: var
  • 不区分大小写的列表排序,而不降低结果的大小?(case-insensitive list sorting, without lowercasing the result?)
    问题 我有一个这样的字符串列表: ['Aden', 'abel'] 我要对项目排序,不区分大小写。 所以我想得到: ['abel', 'Aden'] 但是我对sorted()或list.sort()相反,因为大写字母出现在小写字母之前。 我如何忽略这种情况? 我已经看到了解决方案,其中涉及降低所有列表项的大小写,但是我不想更改列表项的大小写。 回答1 在Python 3.3+中,有一种str.casefold方法是专门为无大小写匹配而设计的: sorted_list = sorted(unsorted_list, key=str.casefold) 在Python 2中使用lower() : sorted_list = sorted(unsorted_list, key=lambda s: s.lower()) 它适用于普通字符串和unicode字符串,因为它们都有lower方法。 在Python 2中,它可以将普通字符串和unicode字符串混合使用,因为这两种类型的值可以相互比较。 但是,Python 3不能那样工作:您不能比较字节字符串和unicode字符串,因此在Python 3中,您应该做明智的事情,并且只能对一种类型的字符串列表进行排序。 >>> lst = ['Aden', u'abe1'] >>> sorted(lst) ['Aden', u'abe1'] >>>
  • 为什么在C#中,字典比哈希表更受青睐?(Why is Dictionary preferred over Hashtable in C#?)
    问题 在大多数编程语言中,字典比哈希表更受青睐。 背后的原因是什么? 回答1 对于它的价值,字典在概念上是一个哈希表。 如果您的意思是“为什么我们为什么要使用Dictionary<TKey, TValue>类而不是Hashtable类?”,这是一个简单的答案: Dictionary<TKey, TValue>是泛型类型,而Hashtable不是。 这意味着您可以使用Dictionary<TKey, TValue>获得类型安全性,因为您不能在其中插入任何随机对象,也不必强制转换取出的值。 有趣的是,.NET Framework中的Dictionary<TKey, TValue>实现基于Hashtable ,您可以从其源代码中的此注释中看出: 通用字典是从Hashtable的来源复制而来的 资源 回答2 Dictionary <<< >>> Hashtable差异: 通用<<< >>>非通用需要自己的线程同步<<< >>>通过Synchronized()方法提供线程安全版本枚举项: KeyValuePair <<< >>>枚举项: DictionaryEntry 较新(> .NET 2.0 )<<< >>>较旧(自.NET 1.0起) 在System.Collections中。通用<<< >>>在System.Collections中请求不存在的键引发异常<<< >>
  • 如何使我的字符串比较不区分大小写?(How do I make my string comparison case-insensitive?)
    问题 我创建了一个Java程序来比较两个字符串: String str = "Hello"; if (str.equals("hello")) { System.out.println("match"); } else { System.out.println("no match"); } 区分大小写。 我如何才能更改它而不是更改它? 回答1 最好的方法是使用str.equalsIgnoreCase(“ foo”)。 为此专门对其进行了优化。 您还可以将两个字符串都转换为大写或小写,然后再将它们与equals进行比较。 对于其他可能不具有equalsIgnoreCase等效语言的语言,记住这一点很有用。 str.toUpperCase().equals(str2.toUpperCase()) 如果您使用的是非罗马字母,请注意equalsIgnoreCase的JavaDoc这部分equalsIgnoreCase , 请注意,此方法未考虑区域设置,对于某些区域设置将导致不令人满意的结果。 Collat​​or类提供对语言环境敏感的比较。 回答2 使用String.equalsIgnoreCase() 。 使用Java API参考来查找以下答案: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html
  • Swift-字典中的存储值顺序已完全更改(Swift - Stored values order is completely changed in Dictionary)
    问题 我试图显示字典格式的数据。 下面是三个尝试。 第一次尝试,输出顺序将完全更改。 第二次尝试,输出顺序与输入相同。 但是,在第三次尝试中,我将变量声明为NSDictionary。 我收到的确切输出。 为什么字典会发生变化? 请指导我。 我搜索了Swift的Dictionary标签。 但是我找不到。 //First Attempt var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"] println(dict) //output: [name2: Roy, name1: Loy] //Second Attempt var dict : Dictionary = ["name2" : "Loy", "name1" : "Roy"] println(dict) //output: [name2: Loy, name1: Roy] ----------------------------------------------------------- //Third Attempt With NSDictionary var dict : NSDictionary = ["name1" : "Loy", "name2" : "Roy"] println(dict) //output: { name1 = Loy; name2
  • .NET数据结构:ArrayList,List,HashTable,Dictionary,SortedList,SortedDictionary —速度,内存以及何时使用它们?(.NET data structures: ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary — Speed, memory, and when to use each?)
    问题 .NET具有许多复杂的数据结构。 不幸的是,它们中的一些非常相似,我不总是确定何时使用一个,何时使用另一个。 我的大多数C#和Visual Basic书籍都在一定程度上谈论它们,但是它们从未真正涉及任何细节。 Array,ArrayList,List,Hashtable,Dictionary,SortedList和SortedDictionary有什么区别? 哪些是可枚举的(IList-可以进行“ foreach”循环)? 哪些使用键/值对(IDict)? 那么内存占用量呢? 插入速度? 检索速度? 还有其他值得一提的数据结构吗? 我仍在寻找有关内存使用和速度(Big-O表示法)的更多详细信息。 回答1 从我的头顶上: Array *-代表一个老式的内存数组-有点像普通type[]数组的别名。 可以枚举。 不能自动增长。 我会假设插入和检索速度非常快。 ArrayList自动增长的数组。 增加更多的开销。 可以枚举,可能比普通数组慢,但仍然非常快。 这些在.NET中使用很多 List是我的最爱之一-可以与泛型一起使用,因此您可以使用强类型数组,例如List<string> 。 除此之外,其行为非常类似于ArrayList Hashtable表-普通的旧哈希表。 O(1)到O(n)最坏的情况。 可以枚举值和键属性,并执行键/值对 Dictionary -与上述相同
  • Python 列表 list 数组 array 常用操作集锦
    Python中的列表(list)类似于C#中的可变数组(ArrayList),用于顺序存储结构。 创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 del sample_list[0] 在列表中插入一个值 sample_list[0:0] = ['sample value'] 得到列表的长度 list_length = len(sample_list) 列表遍历 for element in sample_list: print(element) Python 列表高级操作/技巧 产生一个数值递增列表 num_inc_list = range(30) #will return a list [0,1,2,...,29] 用某个固定值初始化列表 initial_value = 0 list_length = 5 sample_list = [ initial_value for i in range(10)] sample_list = [initial_value]*list_length # sample_list ==
  • 在switch vs字典中,将Func的值设置为更快,为什么?(In a switch vs dictionary for a value of Func, which is faster and why?)
    问题 假设有以下代码: private static int DoSwitch(string arg) { switch (arg) { case "a": return 0; case "b": return 1; case "c": return 2; case "d": return 3; } return -1; } private static Dictionary<string, Func<int>> dict = new Dictionary<string, Func<int>> { {"a", () => 0 }, {"b", () => 1 }, {"c", () => 2 }, {"d", () => 3 }, }; private static int DoDictionary(string arg) { return dict[arg](); } 通过迭代这两种方法并进行比较,即使将“ a”,“ b”,“ c”,“ d”扩展为包括更多键,字典也会变得更快一些。 为什么会这样呢? 这与圈复杂度有关吗? 是因为抖动仅将字典中的return语句编译为本地代码一次吗? 是因为字典的查找是O(1),而对于switch语句可能不是这种情况? (这些只是猜测) 回答1 简短的答案是switch语句是线性执行的,而字典是对数执行的。 在IL级别
  • 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 =
  • 如何进行不区分大小写的字符串比较?(How do I do a case-insensitive string comparison?)
    问题 如何在Python中进行不区分大小写的字符串比较? 我想以一种非常简单且Pythonic的方式封装对常规字符串与存储库字符串的比较。 我还希望能够使用常规python字符串在由字符串散列的字典中查找值。 回答1 假设ASCII字符串: string1 = 'Hello' string2 = 'hello' if string1.lower() == string2.lower(): print("The strings are the same (case insensitive)") else: print("The strings are NOT the same (case insensitive)") 回答2 以不区分大小写的方式比较字符串似乎很简单,但事实并非如此。 我将使用Python 3,因为Python 2在这里尚未开发。 首先要注意的是,使用Unicode进行大小写转换并非易事。 有些文本具有text.lower() != text.upper().lower() ,例如"ß" : "ß".lower() #>>> 'ß' "ß".upper().lower() #>>> 'ss' 但是,假设您想"Buße"比较"BUSSE"和"Buße" 。 哎呀,您可能还想将"BUSSE"和"BUẞE"相等-这是较新的资本形式。 推荐的方法是使用casefold:
  • PostgreSQL是否支持“不区分重音”的排序规则?(Does PostgreSQL support “accent insensitive” collations?)
    问题 在Microsoft SQL Server中,可以指定“不区分重音”的排序规则(对于数据库,表或列),这意味着可以对诸如 SELECT * FROM users WHERE name LIKE 'João' 查找具有Joao名称的行。 我知道可以使用unaccent_string contrib函数从PostgreSQL的字符串中删除重音符号,但是我想知道PostgreSQL是否支持这些“不区分重音”的排序规则,以便上面的SELECT起作用。 回答1 为此,请使用unaccent模块-这与您要链接的模块完全不同。 unaccent是一种文本搜索词典,用于删除词素中的重音符号。 每个数据库安装一次: CREATE EXTENSION unaccent; 如果出现类似以下错误: ERROR: could not open extension control file "/usr/share/postgresql/<version>/extension/unaccent.control": No such file or directory 按照以下相关答案中的指示,在数据库服务器上安装contrib软件包: 在PostgreSQL上创建不突出扩展名时出错 除其他外,它提供了可与示例一起使用的unaccent()函数unaccent()似乎不需要LIKE )。 SELECT *
  • ViewData和ViewBag有什么区别?(What's the difference between ViewData and ViewBag?)
    问题 我在MVC 3中看到了ViewBag 。与MVC 2中的ViewData有什么不同? 回答1 它使用C#4.0动态功能。 它实现了与视图数据相同的目标,应避免使用强类型视图模型(应避免与视图数据相同的方式)。 因此,基本上它替换了魔术字符串: ViewData["Foo"] 具有神奇的特性: ViewBag.Foo 为此,您没有编译时的安全性。 我继续怪微软曾经在MVC中引入这个概念。 属性名称区分大小写。 回答2 内部ViewBag属性存储为ViewData字典中的名称/值对。 注意:在MVC 3的大多数预发行版本中,如MVC 3发行说明中的​​以下片段所述,ViewBag属性被命名为ViewModel: (编辑于10-8-12)建议我发布此信息的来源,这里是来源:http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4 MVC 2控制器支持ViewData属性,该属性使您可以使用后绑定字典API将数据传递到视图模板。 在MVC 3中,还可以对ViewBag属性使用更简单的语法来实现相同的目的。 例如,您可以编写ViewBag.Message =“ text”,而不是编写ViewData [“ Message”] =“ text”。 您无需定义任何强类型的类即可使用ViewBag属性。 因为它是动态属性
  • 更改MYSQL数据库不区分大小写表名
    今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢?  后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区分表名大小写的,哎,弄了那么旧,害死我了。  让MYSQL不区分表名大小写的方法其实很简单:  1.用ROOT登录,修改/etc/my.cnf  2.在[mysqld]下加入一行:lower_case_table_names=1  3.重新启动数据库即可。1、Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;2、用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;lower_case_table_names参数详解:lower_case_table_names=0其中0:区分大小写,1:不区分大小写MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:1、数据库名与表名是严格区分大小写的;2、表的别名是严格区分大小写的;3、列名与列的别名在所有的情况下均是忽略大小写的;4、变量名也是严格区分大小写的;MySQL在Windows下都不区分大小写。mysql默认是对字母的大小写不区分的mysql> create
  • C#字典一键很多值(c# dictionary one key many values)
    问题 我想创建一个数据存储以允许我存储一些数据。 第一个想法是创建一个字典,在该字典中您拥有一个带有多个值的键,因此有点像一对多的关系。 我认为字典只有1个键值。 我还能如何存储此信息? 回答1 从.net3.5 + Dictionary<IKey, List<IValue>>您可以使用Linq名称空间中的Lookup来代替使用Dictionary<IKey, List<IValue>> 。 // lookup Order by payment status (1:m) // would need something like Dictionary<Boolean, IEnumerable<Order>> orderIdByIsPayed ILookup<Boolean, Order> byPayment = orderList.ToLookup(o => o.IsPayed); IEnumerable<Order> payedOrders = byPayment[false]; 来自msdn: 查找类似于字典。 不同之处在于,字典将键映射到单个值,而查阅将键映射到值的集合。 您可以通过在实现IEnumerable的对象上调用ToLookup来创建Lookup的实例。 您可能还想阅读有关相关问题的答案。 有关更多信息,请咨询msdn。 完整示例: using System