如何统计字符串中的唯一字符假设我们有一个变量myString="blabla"ormystring=998769myString.Length;//会得到你的结果myString.计数(字符。IsLetter);//如果你只想要字母数:如何获得唯一字符的数量?我的意思是“blabla”结果必须是3,doe“998769”将是4。它准备好运行了吗?有什么建议么?您可以使用LINQ:varcount=myString.Distinct().Count();它使用了字符串实现IEnumerable的事实。如果没有LINQ,您可以在内部执行与Distinct相同的操作并使用HashSet:varcount=(newHashSet(myString)).Count;如果你只处理英文的ANSI文本(或BMP中的字符),那么如果你写80%for:myString.Distinct().Count()你会玩得很开心,你不会有任何麻烦.让我只为真正需要以正确方式处理它的人发布这个答案。我想说每个人都应该这样做,但我知道这不是真的(引自维基百科):因为最常用的字符在基本多语言平面中,代理对处理通常没有经过彻底测试。这会导致持续存在的漏洞和潜在的安全漏洞,即使是在流行和经过充分评估的应用程序软件中(例如CVE-2008-2938、CVE-2012-2135)我们第一个天真的解决方案问题是它没有正确处理Unicode并且不'考虑到用户认为什么是字符。让我们尝试"𠀑".Distinct().Count()并且您的代码将错误地返回...2因为它的UTF-16表示形式是0xD8400xDC11(顺便说一句,每个单独的字符都不是有效的Unicode字符,因为他们是高低代理。这里,我不会对术语和定义很严格,所以请参考www.unicode.org作为参考。有关(更)广泛的讨论,请阅读如何通过字符比较执行Unicode识别字符?,编码不仅仅是你要考虑的事情。1)它没有考虑到.NETSystem.Char不代表字符(或更具体地说是字母),而是代表UTF-16编码文本的代码单元(例如,可能使用表意字符)。它们经常重合,但总是现在重合。2)如果您将用户认为(或感知)的内容计算为一个字符,那么这将再次失败,因为它不会检查像?这样的组合字符(阿拉伯语中有很多这样的例子)。由于历史原因存在重复:例如,它既是单个Unicode代码点又是组合(然后会失败)。3)我们谈论的是西方/美国对性格的定义。如果您为最终用户统计字符,您可能需要将您的定义更改为他们所期望的(例如,韩语中字符的定义可能不是那么明显,另一个例子是捷克文本ch,它始终被视为单个字符特点)。最后,当您将字符转换为大写/小写时,不要忘记一些奇怪的地方(例如在德语中?是大写的SS,另请参阅这篇文章)。编码C#字符串编码为UTF-16(char是两个字节),但UTF-16不是固定大小的编码,char应该被称为编码单元。这是什么意思?您可能有一个长度为2的字符串,但实际上用户将看到(实际上是)只有一个字符(那么计数应该为1)。如果你需要正确处理这个问题,那么你必须让事情变得更复杂(和更慢)。幸运的是,Char类有一些处理代理的有用方法。以下代码未经测试(出于说明目的,所以绝对没有优化,我相信它可以做得比这更好)所以请将它作为进一步调查的起点:intCountCharacters(stringtext){HashSetcharacters=newHashSet();字符串currentCharacter="";for(inti=0;i请注意,此示例不处理重复项(当同一字符可能具有不同代码或可能是单个代码点或组合字符时)。组合字符如果必须处理组合字符(和当然是编码),那么最好的方法是使用StringInfo类。您将枚举(然后计数)组合和编码的字符:StringInfo.GetTextElementEnumerator(text).Walk().Distinct().Count();Walk()是一个简单的实现扩展方法,它简单地遍历所有IEnumerator元素(我们需要它,因为GetTextElementEnumerator()返回IEnumerator而不是IEnumerable)。请注意,在正确拆分文本后,可以使用我们的第一个解决方案来计算它(重点是砖块不是字符而是字符序列(为简单起见,此处以字符串形式返回)。同样,此代码不处理重复。文化你无法处理第3点中列出的问题。每种语言都有自己的规则,支持它们可能会很痛苦。在这篇较长的特定帖子中有更多文化问题的例子。理解它们很重要(所以你必须知道一点你的目标语言)并且不要忘记Unicode和很少翻译的resx文件不会使你的应用程序全球化。如果文本处理在你的应用程序中很重要,你可以使用专门的DLL解决许多问题你支持的每个语言环境(统计字符,统计单词等),就像一个文字处理器。例如,我列出的问题可以简单地使用字典来解决。我通常做的是不将字符串使用标准的.NET函数(也因为一些错误),我创建了一个Unicode类,其中包含我需要的所有内容(字符计数、转换、比较)和每个特殊派生类支持的语言的静态方法。在运行时,静态方法将使用当前线程区域性名称从字典中选择适当的实现并将工作委托给它。骨架可能看起来像这样:}protectedvirtualstringCountCharactersCore(stringtext){//默认实现,如果需要在派生类中覆盖returnStringInfo.GetTextElementEnumerator(text).Cast().Distinct().Count();}私有字典_implementations;privateUnicodeGetConcreteClass(){stringcultureName=Thread.Current.CurrentCulture.Name;//检查具体类是否已加载并放入字典...return_implementations[cultureName];如果您使用的是C#,Linq可以很好地解决问题——再一次:“blabla”.Distinct().Count()会做到这一点。以上就是C#学习教程:Howtocalculateuniquecharactersinastring。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
