【问题标题】:IndexOf for char array ignoring casingIndexOf 用于 char 数组忽略大小写
【发布时间】:2021-07-11 14:13:13
【问题描述】:

我正在开发一个 pdf 文件查看器。 pdf文件以字节为单位存储字符,pdf文件可以有几兆字节。在这种情况下使用字符串是一个坏主意,因为一个字符串的存储空间不能被另一个字符串重用。因此,我将这些 pdf 字节存储在一个 char 数组中。在阅读下一个大pdf文件时,我可以重用char数组。

现在我需要支持一个搜索功能,以便用户可以在这个巨大的文件中找到某个文本。当我搜索时,我通常不想输入正确的大小写字母,我什至可能不记得正确的大小写,这意味着无论大小写如何,搜索都应该成功。使用时

string.IndexOf(String, StringComparison)

可以选择InvariantCultureIgnoreCase 来获取大小写匹配。

但是,将兆字节字符数组转换成同样大的字符串是个坏主意。

不幸的是,IndexOf Array 没有帮助:

public static int IndexOf<T> (T[] array, T value);

这允许在 char 数组中仅搜索 1 个字符,并且也不支持 IgnoreCase,这显然对其他数组没有意义,例如整数数组。

所以问题是:
DotNet 中可以使用哪种方法在字符数组中搜索字符串。

请在将此问题标记为重复之前阅读此内容
我知道已经有关于搜索的类似问题。但是我看到的都是以一种或另一种方式将字符数组转换为字符串,这是我绝对不想要的。

另请注意,其中许多解决方案不支持忽略大小写。该解决方案还应该正确处理奇异的 Unicode。

最后但同样重要的是,最好是 DotNet 的现有方法。

【问题讨论】:

  • char 不存在这个的原因是因为您通常需要整个字符串来决定如何比较,例如是否忽略变音符号或非规范化字符。

标签: c# arrays search indexof


【解决方案1】:

我得出的结论是,我需要为字符数组实现自己的 IndexOf 方法。然而,事实证明编程相当具有挑战性,所以我查看了 DotNet 源代码 string.IndexOf 是如何做到的。

这有点令人困惑,因为一种方法正在调用另一种方法,而另一种方法又调用另一种方法,每个方法都做的不多。最后,到达:

public unsafe int IndexOf(ReadOnlySpan<char> source, ReadOnlySpan<char> value,
                          CompareOptions options = CompareOptions.None)

瞧,这正是我正在寻找的功能,因为将 char[] 转换为 ReadOnlySpan&lt;char&gt; 非常容易。该方法属于CompareInfo 类。要调用它,必须这样写:

var index = CultureInfo.InvariantCulture.CompareInfo.IndexOf(bigCharArray,
                                          searchString, CompareOptions.IgnoreCase);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多