【问题标题】:Is there an enum type for letters in .NET framework?.NET 框架中是否有字母的枚举类型?
【发布时间】:2013-11-05 20:37:03
【问题描述】:

我需要定义在项目中使用的字母的枚举类型。 .NET 框架中有这样的枚举类型吗?

【问题讨论】:

  • 您可能想看看这个答案:stackoverflow.com/questions/572963/… 简短的答案是“否”,但字母也称为 CHAR,它是一个数字。所以你几乎可以直接使用 char 而不是枚举。
  • 请注意,枚举默认使用 System.Int32 作为支持。您可以将其解释为 UTF-32 编码的 Unicode 代码点(当然,大多数值都在 Unicode 范围之外,但这没问题)。请注意,char 结构 (System.Char) 具有您可以使用的静态方法 ConvertFromUtf32 和 ConvertToUtf32。如果您所有的 Unicode 字符都在 BMP (plane 0) 中,那就更简单了:只需在 char 之间进行转换。不过要小心标准化。

标签: c# .net linq enums base-class-library


【解决方案1】:

您想到了世界上数百种常用字母中的哪一种?这当然是问题所在。

最糟糕的问题是,即使在采用相同字母表的语言中,字母顺序也不相同。例如,丹麦人将 å 放在第一位而不是最后一位。枚举的严重属性,不可能想出一个可以表示字母的枚举。除非它是一个非常晦涩的程序,仅在世界的一小部分使用,或者您的程序不会传播很远。在互联网时代几乎不可能。

确保你不要尝试,保留它char。并且永远不要忽视对 System.StringComparison 的需求

【讨论】:

  • 顺序(排序规则)可能与他的使用无关。 (即使 ASCII 字符在不同的文化中也可以有不同的排序规则,例如西弗里斯兰语将 Y 放在 I 附近,而爱沙尼亚语将 Z 放在 S 附近。)任何 unicode 字符都可以很容易地放入 Int32 (通过 UTF-32)。当然,Unicode 规范化将是一个问题。
  • 我出生在那里 :) Y 实际上是 IJ 的连字。并且通常用分音符号书写,Ÿ。
  • 这表明事情是多么复杂。然而Lithuanian 也将Y 放在I 附近,我不认为他们的Y 与荷兰语和弗里斯兰语的IJ 相同。现在,我是 Dane :-) 我们确实把 Å 放在最后,最后三个字母是 Æ-Ø-Å。但是瑞典语在其字母表末尾有Å-Ä-Ö 的顺序。
【解决方案2】:

鉴于没有可用的枚举,一种快速生成包含字符集所有字母的可枚举(IEnumerable of Char)的方法是......

 var letters = Enumerable.Range(0, 255).Select(Convert.ToChar).Where(Char.IsLetter);

您可以使用 IsDigit 或 IsPunctuation 对方法组进行“或”操作以包含其他字母。

注意:这种方法存在局限性和假设。检查这些...

Unicode 字符分为几类。一个角色 类别是其属性之一。例如,一个字符可能是 一个大写字母、一个小写字母、一个十进制数字、一个 字母数字、连接标点符号、数学符号或货币 象征。 UnicodeCategory 类返回 Unicode 的类别 特点。有关 Unicode 字符的详细信息,请参阅 Unicode 标准。

来源:How to determine if a CultureInfo instance supports Latin characters

.NET Framework 使用 Char 结构来表示 Unicode 特点。 Unicode 标准用 一个唯一的 21 位标量数,称为代码点,并定义 UTF-16 编码形式,指定如何将代码点编码为 一个或多个 16 位值的序列。每个 16 位值的范围从 十六进制 0x0000 到 0xFFFF 并存储在 Char 结构中。 Char 对象的值是它的 16 位数字(序数)值。

来源:http://msdn.microsoft.com/en-us/library/System.Char(v=vs.110).aspx

【讨论】:

  • 我是日本人。此代码未生成我的本机字符集中的任何字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2015-12-20
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多