如何改进这种方法将名称转换为正确的案例?

Kel*_*sey 17 c# case-sensitive

我正在编写一个基本功能,在一次性批处理过程中将数百万个名称从当前的大写形式转换为适当的混合大小写.我想出了以下功能:

public string ConvertToProperNameCase(string input)
{
    char[] chars = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input.ToLower()).ToCharArray();

    for (int i = 0; i + 1 < chars.Length; i++)
    {
        if ((chars[i].Equals('\'')) ||
            (chars[i].Equals('-')))
        {                    
            chars[i + 1] = Char.ToUpper(chars[i + 1]);
        }
    }
    return new string(chars);
}
Run Code Online (Sandbox Code Playgroud)

它适用于大多数情况,例如:

  1. 约翰史密斯→约翰史密斯
  2. 史密斯,约翰T→史密斯,约翰T.
  3. 约翰奥布里安→约翰奥布莱恩
  4. JOHN DOE-SMITH→John Doe-Smith

有些边缘情况不起作用:

  1. JASON MCDONALD→Jason Mcdonald(正确:Jason McDonald)
  2. OSCAR DE LA HOYA→Oscar De La Hoya(正确:Oscar de la Hoya)
  3. MARIE DIFRANCO→Marie Difranco(正确:Marie DiFranco)

这些都没有被捕获,我不确定我是否可以处理所有这些奇怪的边缘情况.如何更改或添加以捕获更多边缘案例?我相信还有很多边缘情况,我甚至都没想过.所有套管也应遵循北美惯例,这意味着如果某些国家期望不同的大写形式,那么北美格式优先.

Joh*_*lph 9

我想你会再次在这里跑墙,因为通常你无法正确判断转换是否合理.

考虑你的边缘情况

JASON MCDONALD - > Jason Mcdonald(正确:Jason McDonald)

您只需在姓名开头检查Mc,然后应用您的更正,对吧?但是如果你的人被命名为Mcizck(我当然是这样做了)并且不应该纠正给Mc Izck而应该保留原样呢?

这个问题没有100%完美的解决方案.你在这里遇到的是一个自然语言问题,特别是对于计算机而言,它们很难解决.文化太不同,无法正确建模.即使你说北美惯例优先,你也会有很高的"误报".我们的社会由多种文化组成,仅仅说"北美优先"是不够的.

如果不处理边缘情况,我猜您当前的解决方案将在99%的时间内正常工作.如果确实需要100%正确的名称,则应手动更正所有其他边缘情况.


Joh*_*her 5

我希望您进行此转换的原因是因为软件正在改变以允许用户首先使用正确的外壳输入其名称.

也就是说,唯一可靠的解决方案是通知用户您已更改其名称的表示形式.然后,如果不正确,他们可以编辑外壳.(你可以打电话给他们,给他们发电子邮件,等到他们下次再使用你的软件,等等)

如果你不能让用户更新他们自己的名字,那么第二个最可靠的方法是从公共来源收集(最后)名字的列表.如果你能找到足够的这些,你应该能够覆盖更多的边缘情况 - 只需查看你的正确套件列表中是否存在该名称,然后使用该套管.

  • 如果这是批量清理,则根本不应更改案例.所有情况下的所有上限都意味着案件信息未知.引入大写相关实际上会污染您的数据,因为您从0%的大小写错误变为> 0%的大小写错误. (2认同)