【问题标题】:Linq Contains without considering accents [duplicate]Linq包含而不考虑重音[重复]
【发布时间】:2015-09-28 16:43:24
【问题描述】:

我需要获取文本包含忽略所有重音的特定单词的所有结果。

现在我有以下内容:

filtered = result.Where(p => p.@string.ToString().ToUpper().Contains(word));

或简化版:

filtered = result.ToUpper().Contains(word));

如何让“包含”语句忽略重音符号?

提前致谢

【问题讨论】:

标签: c# linq


【解决方案1】:

借用一个类似的解决方案表格here

string[] result = {"hello there", "héllo there","goodbye"};

string word = "héllo";

var compareInfo = CultureInfo.InvariantCulture.CompareInfo;

var filtered = result.Where(
      p => compareInfo.IndexOf(p, word, CompareOptions.IgnoreNonSpace) > -1);

【讨论】:

  • 完美运行!谢谢。
  • 最简单的方法是将您正在使用的列的排序规则更改为与数据对应的排序规则。这样,您无需在代码中执行任何操作。这是执行此操作的 sql 命令: ALTER TABLE table_name_here ALTER COLUMN clumn_name_here [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI
  • @SterlingDiaz 没错,这很简单,但可能会在问题范围之外产生巨大的副作用。搜索、排序和其他比较可能会受到负面影响。
  • 如果是重音,例如,校对是拉丁语,因为英语没有它。这是一个数据库设计/数据类型/整理问题,而不是 linq 问题。
  • 不幸的是,这个解决方案至少不适用于西班牙语,其中ñ 不是重音n,而是一个单独的字母。请参阅 this answer 如何规范化西班牙语字符串。
【解决方案2】:

您想使用StringComparison.InvariantCultureIgnoreCase 枚举。

来源https://msdn.microsoft.com/en-us/library/system.stringcomparison(v=vs.110).aspx

filtered = result.Contains(word, StringComparison.InvariantCultureIgnoreCase);

然而,这只适用于 LinqToObject。如果您使用的是 LinqToSQL 或 LinqToEntityFramework 或 LinqToNHibernate,这将不起作用。

【讨论】:

  • 字母大小写通常不称为“重音” - 没有 StringComparison 选项可以让人们忽略重音(假设 OP 实际上对此感兴趣)
  • @AlexeiLevenkov 请查看提供的链接。我的意思是使用枚举的InvariantCulture 部分。你也应该看看the various different compares that are demonstrated here
  • Aron,我不确定您希望InvariantCulture 做什么比较 - 该枚举的值都没有处理重音(所有关于排序规则和大小写)。此外,Contains 不采用 StringComparison(尽管每个人都希望如此)-您可能是指 IndexOf... 代码示例:"e".IndexOf("é", StringComparison.InvariantCultureIgnoreCase)string.Compare("e","é", StringComparison.InvariantCultureIgnoreCase) 表明重音字符被认为与这些操作不同。
猜你喜欢
  • 2022-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多