c# – 使用IndexOf与CultureInfo 1031的ArgumentOutOfRangeException

前端之家收集整理的这篇文章主要介绍了c# – 使用IndexOf与CultureInfo 1031的ArgumentOutOfRangeException前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
string s = "Gewerbegebiet Waldstraße"; //other possible input "Waldstrasse"

int iFoundStart = s.IndexOf("strasse",StringComparison.CurrentCulture);
if (iFoundStart > -1)
    s = s.Remove(iFoundStart,7);

我正在运行CultureInfo 1031(德国).

IndexOf将’straße’或’strasse’与定义的’strasse’匹配,并返回18作为位置.

Remove和Replace都没有设置文化的重载.

如果我删除6个字符使用Remove 1字符将留下,如果input-string是’strasse’和’straße’将工作.
如果input-string是’straße’,并且我删除7个字符,我得到ArgumentOutOfRangeException.

有没有办法安全地删除找到的字符串?提供IndexOf的最后一个索引的任何方法?我走近IndexOf,它的本机代码在引擎盖下,如预期的 – 所以没有办法做一些自己的事情…

解决方法

本机Win32 API会公开发现的字符串的长度.您可以使用P / Invoke直接拨打 FindNLSStringEx
static class CompareInfoExtensions
{
    [DllImport("kernel32.dll",CharSet = CharSet.Unicode,ExactSpelling = true)]
    private static extern int FindNLSStringEx(string lpLocaleName,uint dwFindNLSStringFlags,string lpStringSource,int cchSource,string lpStringValue,int cchValue,out int pcchFound,IntPtr lpVersionInformation,IntPtr lpReserved,int sortHandle);

    const uint FIND_FROMSTART = 0x00400000;

    public static int IndexOfEx(this CompareInfo compareInfo,string source,string value,int startIndex,int count,CompareOptions options,out int length)
    {
        // Argument validation omitted for brevity
        return FindNLSStringEx(compareInfo.Name,FIND_FROMSTART,source,source.Length,value,value.Length,out length,IntPtr.Zero,0);
    }
}

static class Program
{
    static void Main()
    {
        var s = "<<Gewerbegebiet Waldstraße>>";
        //var s = "<<Gewerbegebiet Waldstrasse>>";
        int length;
        int start = new CultureInfo("de-DE").CompareInfo.IndexOfEx(s,"strasse",s.Length,CompareOptions.None,out length);
        Console.WriteLine(s.Substring(0,start) + s.Substring(start + length));
    }
}

我没有看到一种纯粹是BCL的方法.

原文链接:https://www.f2er.com/csharp/95309.html

猜你在找的C#相关文章