Port pascal const IdentChars = ['a'..'z','A'..'Z','_'];对C#的声明

时间:2011-06-12 06:17:41

标签: c# delphi

我正在将一个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] = '_';

必须有一种更有效的方式。

6 个答案:

答案 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()是一种快速而又脏的方法;)