Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是可以处理代理项对的String.IndexOf(字符串输入)的Unicode安全副本?_C#_String_Unicode_Indexof_Surrogate Pairs - Fatal编程技术网

C# 什么是可以处理代理项对的String.IndexOf(字符串输入)的Unicode安全副本?

C# 什么是可以处理代理项对的String.IndexOf(字符串输入)的Unicode安全副本?,c#,string,unicode,indexof,surrogate-pairs,C#,String,Unicode,Indexof,Surrogate Pairs,我试图找出一个与C#string.IndexOf(string)等价的方法,它可以处理Unicode字符中的代理项对 我能够在仅比较单个字符时获得索引,如下面的代码所示: public static int UnicodeIndexOf(this string input, string find) { return input.ToTextElements().ToList().IndexOf(find); } public static IE

我试图找出一个与C#
string.IndexOf(string)
等价的方法,它可以处理Unicode字符中的代理项对

我能够在仅比较单个字符时获得索引,如下面的代码所示:

    public static int UnicodeIndexOf(this string input, string find)
    {
        return input.ToTextElements().ToList().IndexOf(find);
    }

    public static IEnumerable<string> ToTextElements(this string input)
    {
        var e = StringInfo.GetTextElementEnumerator(input);
        while (e.MoveNext())
        {
            yield return e.GetTextElement();
        }
    }
public static int UnicodeIndexOf(此字符串输入,字符串查找)
{
返回input.ToTextElements().ToList().IndexOf(find);
}
公共静态IEnumerable ToTextElements(此字符串输入)
{
var e=StringInfo.GetTextElementEnumerator(输入);
while(如MoveNext())
{
产生返回e.GetTextElement();
}
}
但是,如果我尝试实际使用字符串作为
find
变量,那么它将不起作用,因为每个文本元素只包含一个要比较的字符

关于如何写这篇文章,有什么建议吗

谢谢你的帮助

编辑:

下面是一个示例,说明了为什么这是必要的:

代码


Console.WriteLine(“HolyCow您基本上希望在另一个字符串数组中找到一个字符串数组的索引。我们可以将问题中的代码改编为:

公共静态类扩展{
公共静态int UnicodeIndexOf(此字符串输入,字符串查找,StringComparison=StringComparison.CurrentCulture){
返回索引(
//按代码点拆分输入
input.ToTextElements().ToArray(),
//按代码点拆分搜索值
查找.ToTextElements().ToArray(),
比较);
}
//来自另一个答案的代码
私有静态int IndexOf(字符串[]干草堆、字符串[]针、字符串比较){
var len=针的长度;
var limit=干草堆。长度-长度;

对于(var i=0;我对字符串使用相同的编码,而您是good@Steve我在我的问题中添加了一些信息。这些字符串是相同的编码还是有区别?@Ibrennan208,从您最初的实现来看,您似乎在试图找到一个单一的图形,因为您正在对字符串数组使用
IndexOf
这实际上是
TextElements
,但从示例数据来看,您实际上希望找到长度大于1的子字符串的索引。您可以指定您正在寻找的解决方案吗?(只需在测试数据上运行代码-它不起作用-indexOf将返回-1)@ironstone13我想找到长度大于1的子字符串的索引。在问题中,我解释说,如果我只将字符串与单个字符进行比较,我可以让它工作,但我想扩展它,允许用户输入多字符字符串来查找的索引。很好,我写的是相同的,但你更快了!谢谢,这是正是我要找的!
 Console.WriteLine("HolyCowYou basically want to find index of one string array in another string array. We can adapt code from this question for that:

public static class Extensions {
    public static int UnicodeIndexOf(this string input, string find, StringComparison comparison = StringComparison.CurrentCulture) {
        return IndexOf(
           // split input by code points
           input.ToTextElements().ToArray(),
           // split searched value by code points
           find.ToTextElements().ToArray(), 
           comparison);
    }
    // code from another answer
    private static int IndexOf(string[] haystack, string[] needle, StringComparison comparision) {
        var len = needle.Length;
        var limit = haystack.Length - len;
        for (var i = 0; i <= limit; i++) {
            var k = 0;
            for (; k < len; k++) {
                if (!String.Equals(needle[k], haystack[i + k], comparision)) break;
            }

            if (k == len) return i;
        }

        return -1;
    }

    public static IEnumerable<string> ToTextElements(this string input) {
        var e = StringInfo.GetTextElementEnumerator(input);
        while (e.MoveNext()) {
            yield return e.GetTextElement();
        }
    }
}