gpt4 book ai didi

c# - LINQ Where 忽略重音和大小写

转载 作者:IT王子 更新时间:2023-10-29 04:21:10 26 4
gpt4 key购买 nike

通过忽略重音和大小写的 Where 方法使用 LINQ 过滤元素的最简单方法是什么?

到目前为止,我已经能够通过对属性调用方法来忽略大小写,我认为这不是一个好主意,因为它为每个元素调用相同的方法(对吧?)。

到目前为止,这是我得到的:

var result = from p in People
where p.Name.ToUpper().Contains(filter.ToUpper())
select p;

请告诉我这是否是一个好的做法,以及忽略重音的最简单方法。

最佳答案

要忽略大小写和重音符号(变音符号),您可以先定义一个扩展方法,如下所示:

    public static string RemoveDiacritics(this String s)
{
String normalizedString = s.Normalize(NormalizationForm.FormD);
StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < normalizedString.Length; i++)
{
Char c = normalizedString[i];
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
stringBuilder.Append(c);
}

return stringBuilder.ToString();
}

(修改自 Ignoring accented letters in string comparison )

现在您可以运行查询了:

string queryText = filter.ToUpper().RemoveDiacritics();

var result = from p in People
where p.Name.ToUpper().RemoveDiacritics() == queryText
select p;

如果您只是在 C# 中迭代​​集合,这很好,但如果您使用 LINQ to SQL,最好避免在 LINQ 查询中使用非标准方法(包括扩展方法)。这是因为您的代码无法转换为有效的 SQL,因此无法在 SQL Server 上运行并获得所有出色的性能优化。

由于在 LINQ to SQL 中似乎没有忽略重音的标准方法,在这种情况下,我建议将您要搜索的字段类型更改为不区分大小写和重音 (CI_AI)。

以你的例子:

ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI

您的查询现在应该忽略重音和大小写。

请注意,您需要在运行上述查询之前暂时删除字段上的所有唯一约束,例如

ALTER TABLE People DROP CONSTRAINT UQ_People_Name

现在您的 LINQ 查询将只是:

var result = from p in People
where p.Name == filter
select p;

参见相关问题 here .

关于c# - LINQ Where 忽略重音和大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com