Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 麦当劳在C中加上字母#_C#_String - Fatal编程技术网

C# 麦当劳在C中加上字母#

C# 麦当劳在C中加上字母#,c#,string,C#,String,如何将名称转换为C#中的大小写 我有一份名单,我想证明一下 例如:麦当劳到麦当劳或奥布莱恩到奥布莱恩。这是一个有趣的问题。我认为没有现成的解决方案 我已将以下文章加入书签,这篇文章可能与您想要的内容非常接近: 我还没有尝试过这些代码,这个解决方案几乎需要手动处理所有情况。但是这只是一个开始,也许你会发现它很有用。计算机绝对不可能仅仅神奇地知道“麦当劳”中的第一个“D”应该大写。因此,我认为有两种选择 有人可能有一个软件或一个库,可以为你做这件事 除此之外,您唯一的选择是采取以下方法:首先,我会

如何将名称转换为C#中的大小写

我有一份名单,我想证明一下


例如:麦当劳到麦当劳或奥布莱恩到奥布莱恩。

这是一个有趣的问题。我认为没有现成的解决方案

我已将以下文章加入书签,这篇文章可能与您想要的内容非常接近:


我还没有尝试过这些代码,这个解决方案几乎需要手动处理所有情况。但是这只是一个开始,也许你会发现它很有用。

计算机绝对不可能仅仅神奇地知道“麦当劳”中的第一个“D”应该大写。因此,我认为有两种选择

  • 有人可能有一个软件或一个库,可以为你做这件事

  • 除此之外,您唯一的选择是采取以下方法:首先,我会在一本有“有趣”大写字母的单词词典中查找该名称。显然你必须自己提供这本词典,除非已经有了。第二,应用一种算法来纠正一些明显的错误,比如以O'和Mac以及Mc开头的凯尔特人的名字,尽管有足够多的名字,这种算法无疑会有很多误报。最后,将不符合前两个条件的每个名称的第一个字母大写


  • 其中最困难的部分是确定资本化的算法。字符串操作本身非常简单。没有一个完美的方法,因为没有案例的“规则”。一种策略可能是一组规则,例如“将第一个字母大写…通常”和“如果前两个字母是mc,则将第三个字母大写…通常”

    从一本真名词典开始,并将它们与你自己的名字进行比较,寻找匹配项,这会有所帮助。您还可以获取一个实名词典,从中生成一个Markhov链,并在Markhov链上抛出任何新名称以确定大小写。这是一个疯狂而复杂的解决方案


    最终的完美解决方案是使用人工更正数据。

    这样做需要您的程序能够在一定程度上解释英语。至少能把一个字符串分解成一组单词。Net框架中没有内置的API可以实现这一点

    但是,如果有,您可以使用以下代码

    public string ProperCase(string str, Func<string,bool> isWord) {
      var word = new StringBuilder();
      var cur = new StringBuilder();
      for ( var i = 0; i < str.Length; i++ ) {
        cur.Append(cur.Length == 0 ? Char.ToUpper(str[i]) : str[i]));
        if ( isWord(cur.ToString()) {
          word.Append(cur.ToString());
          cur.Length = 0;
        }
      }
      if ( cur.Length > 0 ) {
        word.Append(cur);
      }
      return word.ToString();
    }
    
    publicstringpropercase(stringstr,Func-isWord){
    var word=新的StringBuilder();
    var cur=新的StringBuilder();
    对于(变量i=0;i0){
    附加词(cur);
    }
    返回word.ToString();
    }
    

    这不是一个完美的解决方案,但它给了你一个大致的思路:

    > P>你可以考虑使用一个搜索引擎来帮助你。提交一个查询,看看结果如何大写这个名字。

    < p>我写了以下扩展方法。请随意使用。< /P>
    public static class StringExtensions
    {
      public static string ToProperCase( this string original )
      {
        if( original.IsNullOrEmpty() )
          return original;
    
        string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
        return result;
      }
    
      public static string WordToProperCase( this string word )
      {
        if( word.IsNullOrEmpty() )
          return word;
    
        if( word.Length > 1 )
          return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );
    
        return word.ToUpper( CultureInfo.CurrentCulture );
      }
    
      private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
    
      private static readonly string[] _prefixes = { "mc" };
    
      private static string HandleWord( Match m )
      {
        string word = m.Groups[1].Value;
    
        foreach( string prefix in _prefixes )
        {
          if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
            return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
        }
    
        return word.WordToProperCase();
      }
    }
    

    您可以根据具有正确大小写的字典(文件)检查小写/混合大写姓氏,然后从字典返回“real”值


    我用谷歌快速搜索了一下,看看是否有,但没有用!

    我正计划编写这样一个函数,但可能不会涉及太多的边缘情况…下面用psuedo代码与regex进行匹配

    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    string txt = textInfo.ToTitleCase("texthere");
    
    以/\b[A-Z]+\b/作为集合匹配开始,这样每个字母序列在单词边界上作为集合匹配

    if the string is all uppercase...
      lower-case the string
      upper-case the first letter
      do the following beginning of string replacements
        Vanb -> VanB
        Vanh -> VanH
        Mc? -> Mc?  (uppercase wildcard character)
        Mac[^kh] -> Mac? (uppercase wildcard match)
    
    使用替换的全名字符串与其他替换集进行匹配,如

    "De La " -> "de la "
    

    这应该特别适用于名称的大多数情况……但是一个很好的通用名称大小写数据库将非常好。

    这是我的解决方案。这将名称硬编码到程序中,但只需一点工作,您就可以在程序外保留一个文本文件,读取名称异常(即Van、Mc、Mac)并循环通过它们

    public static String toProperName(String name)
    {
        if (name != null)
        {
            if (name.Length >= 2 && name.ToLower().Substring(0, 2) == "mc")  // Changes mcdonald to "McDonald"
                return "Mc" + Regex.Replace(name.ToLower().Substring(2), @"\b[a-z]", m => m.Value.ToUpper());
    
            if (name.Length >= 3 && name.ToLower().Substring(0, 3) == "van")  // Changes vanwinkle to "VanWinkle"
                return "Van" + Regex.Replace(name.ToLower().Substring(3), @"\b[a-z]", m => m.Value.ToUpper());
    
            return Regex.Replace(name.ToLower(), @"\b[a-z]", m => m.Value.ToUpper());  // Changes to title case but also fixes 
                                                                                       // appostrophes like O'HARE or o'hare to O'Hare
        }
    
        return "";
    }
    

    手动处理案例是我所知道的唯一方法。我们有一个内部库,它可以做几乎相同的事情(最终我们不得不不时地添加新的怪癖)。Doh,刚刚注意到Gregory用额外的(有用的)语言说了同样的事情观察结果。我优雅地退出:]我从来没有真正做到过。听起来像是新实习生的任务!请不要用“Mac”来做假想。我的名字经常被愚蠢的邮件系统弄伤。@MaciejTrybiło:机器会这样做的。虽然这段代码可以回答这个问题,但提供了关于为什么和/或这段代码如何回答这个问题提高了它的长期价值。这并没有解决“Mc”案例。标题案例将使它成为“麦当劳”而不是“麦当劳”。你太棒了!谢谢!