【问题标题】:How do I get the case insensitive match in List<string>?如何在 List<string> 中获得不区分大小写的匹配项?
【发布时间】:2013-03-11 20:12:18
【问题描述】:

我有一个列表中的单词列表。使用 .Contains(),我可以确定一个单词是否在列表中。如果我指定的单词在列表中,我如何从列表中获取单词的区分大小写的拼写?例如,当单词是“磷酸钠”但列表包含“磷酸钠”时,.Contains() 为真。如何执行不区分大小写的搜索(“磷酸钠”),但从列表中返回区分大小写的匹配项(“磷酸钠”)?

我更喜欢避免使用键为大写且值正确大小写的字典,反之亦然。

【问题讨论】:

  • 旁注:您的标题说“区分大小写”,但看起来您正在寻找相反的内容。还有任何特殊原因使用不区分大小写的键匹配的字典吗?
  • @AlexeiLevenkov 好吧,使用字典会导致程序的内存占用增加三倍,而不是使用更合适的(在这种情况下)搜索方法。
  • @AlexeiLevenkov 字典不会代替列表中的线性搜索,它会是除了,这就是它如此损失的原因。他在想if(list.Contains(searchText, invariantComparer)) return caseLookup[searchText];之类的东西。

标签: c# .net-4.0


【解决方案1】:

你想要这样的东西:

string match = list.FirstOrDefault(element => element.Equals(target, 
                                     StringComparison.CurrentCultureIgnoreCase));

如果找不到匹配项,这会将 match 保留为 null 引用。

(您可以使用List&lt;T&gt;.Find,但使用FirstOrDefault 会使代码更通用,因为它可以工作 - 在文件顶部使用using System.Linq; 指令)在任何 序列上字符串。)

请注意,我假设列表中没有空元素。如果您想处理这个问题,您可能需要使用静态方法调用:string.Equals(element, target, StringComparison.CurrentCultureIgnoreCase)

另外请注意,我假设您想要一个文化敏感的比较。其他选项请参见StringComparison

【讨论】:

  • 出于好奇,为什么不StringComparison.OrdinalIgnoreCase
  • +1 虽然这是对问题的绝对正确答案,但请注意,通过无序列表进行线性搜索并不是最快的操作 - 以这种方式构建 100 个项目的列表可能很容易变成问题。跨度>
  • @AlexeiLevenkov 几百根本不是问题。您需要数十万才能真正成为一个大问题。
【解决方案2】:

考虑Dictionary 是否适合您使用不区分大小写的比较。除非您关心单词的顺序,否则Dictionary 会比列表提供更好的查找性能。

Dictionary<string, string> openWith = 
      new Dictionary<string, string>( 
         StringComparer.CurrentCultureIgnoreCase);

【讨论】:

    【解决方案3】:

    您也可以在列表中使用StringComparer

    if (listOfValues.Contains(value, StringComparer.OrdinalIgnoreCase))
    

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2017-11-14
      • 2012-03-15
      相关资源
      最近更新 更多