这是我遇到的一个问题,但都失败了
假设说
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函数永远不应该在任何真正的生产代码中完成,这里显示的代码不应该被认真对待.
我的回答有点晚,但我想发布相同的内容。尽管上述所有解决方案都是正确的,但是我相信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)
| 归档时间: |
|
| 查看次数: |
24696 次 |
| 最近记录: |