我正在将一个Delphi应用程序移植到C#。在其中一个单位中有一个这样的声明:
const
IdentChars = ['a'..'z', 'A'..'Z', '_'];
我没有为C#找到类似的声明语法。
这是我能想到的最好的:
char[] identFirstChars; // = ['a'..'z', 'A'..'Z', '_'];
int size = (int)'z' - (int)'a' + 1 + (int)'Z' - (int)'A' + 1 + 1;
identFirstChars = new char[size];
int index = 0;
for(char ch = 'a'; ch <= 'z'; ch = (char)((int)(ch) + 1))
{
identFirstChars[index] = ch;
index++;
}
for (char ch = 'A'; ch <= 'Z'; ch = (char)((int)(ch) + 1))
{
identFirstChars[index] = ch;
index++;
}
identFirstChars[index] = '_';
必须有一种更有效的方式。
答案 0 :(得分:6)
IdentChars是一个集合,在C#中没有直接等价(真的有点痛苦)。其次,IdentChars是一组Ansi字符,而不是Unicode字符,所以在那里要小心。因此,最好在“移植”之前查看它是如何使用的,因为您需要的功能内置于Deplhi编译器中,您必须自己在C#中编写代码。
答案 1 :(得分:5)
这个怎么样?
char[] identFirstChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_".ToCharArray();
当然,您可以在代码中生成一个数组(这可能可以使用Enumerable.Range更少的行完成)但我认为在您的情况下它不值得。
答案 2 :(得分:1)
char[] ar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_".ToArray();
答案 3 :(得分:1)
不是最有效的方法,但至少你不会错过错过的字符:
var chars =
Enumerable.Range('a', 'z' - 'a')
.Concat(Enumerable.Range('A', 'Z' - 'A'))
.Select(arg => (char)arg)
.Concat(new[] { '_' })
.ToArray();
答案 4 :(得分:1)
尝试以下,
public static char[] GetConstants()
{
var array = Enumerable.Range((int) 'a', 26).ToList();
array.AddRange(Enumerable.Range((int) 'A', 26));
array.Add('_');
return array.Select(z => (char) z).ToArray();
}
答案 5 :(得分:0)
char[] identFirstChars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_".ToCharArray()
是一种快速而又脏的方法;)