不使用内置函数计算单词长度

Bin*_*nil 5 c# string

这是我遇到的一个问题,但都失败了

假设说

string str = "wordcounter";
Run Code Online (Sandbox Code Playgroud)

人们可以很容易地找到长度使用 str.Length

然而,在C#中有可能得到的字母数,而无需使用任何一样内置的功能Length,SubStr等等

Dar*_*rov 13

你可以编写一个循环并在这个循环中增加一个计数器:

int numberOfLetters = 0;
foreach (var c in str)
{
    numberOfLetters++;
}
// at this stage numberOfLetters will contain the number of letters 
// that the string contains
Run Code Online (Sandbox Code Playgroud)

还有另一种方式:

int numberOfLetters = str.ToCharArray().Length;
Run Code Online (Sandbox Code Playgroud)

使用在BSTR上运行的SysStringByteLen函数还有另一种甚至更疯狂的方法..NET中的字符串通过使用4字节整数在内存中布局,该整数包含字符串的长度,后跟表示每个字符的许多2字节UTF-16字符.这类似于BSTR的存储方式.所以:

class Program
{
    [DllImport("oleaut32.dll")]
    static extern uint SysStringByteLen(IntPtr bstr);

    static void Main()
    {
        string str = "wordcounter";
        var bstr = Marshal.StringToBSTR(str);

        // divide by 2 because the SysStringByteLen function returns 
        // number of bytes and each character takes 2 bytes (UTF-16)
        var numberOfLetters = SysStringByteLen(bstr) / 2; 
        Console.WriteLine(numberOfLetters);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,做这样的事情而不是使用内置Length函数永远不应该在任何真正的生产代码中完成,这里显示的代码不应该被认真对待.


ykm*_*m29 5

我的回答有点晚,但我想发布相同的内容。尽管上述所有解决方案都是正确的,但是我相信foreach的IL确实会在迭代之前知道其长度。谈到纯解决方案,这是我的:

    private int stringLength(string str) {
        int length = 0;
        bool done = false;
        do {
            try {
                char c = str[length];
                length++;
            } catch (IndexOutOfRangeException) {
                done = true;
            }
        } while(!done);
        return length;
    }
Run Code Online (Sandbox Code Playgroud)