如何合并去除全名中间名与首字母大写功能?C#代码求助
解决方案:整合大小写处理与姓名提取功能
我看到你现在有两个独立的方法,但没法把它们结合起来实现目标——提取首名+姓氏,同时正确处理大小写(例外词小写)。咱们一步步来修正代码:
首先,先修正现有方法的问题
你的RemoverNomeDoMeio方法里有个明显的问题:硬编码了nomeCompleto = "cleber reis pereira",没有使用传入的nome参数,而且最后返回的只是处理了大小写的原名字,根本没执行提取首名和姓氏的逻辑。
整合后的完整代码
下面是把两个功能结合后的代码,同时优化了逻辑:
namespace TesteArgo { public class teste3 { // 处理大小写:首字母大写,例外词全小写 private string NomesComPrimeirasLetrasMaiusculas(string nome) { string[] excecoes = new string[] { "e", "de", "da", "do", "dos" }; var palavras = new Queue<string>(); foreach(var palavra in nome.Split(' ', StringSplitOptions.RemoveEmptyEntries)) { var emMinusculo = palavra.ToLower(); var letras = emMinusculo.ToCharArray(); if (!excecoes.Contains(emMinusculo)) { letras[0] = char.ToUpper(letras[0]); } palavras.Enqueue(new string(letras)); } return string.Join(" ", palavras); } // 提取首名+姓氏,同时应用大小写规则 public string ExtrairPrimeiroESobrenome(string nome) { // 第一步:先处理大小写 string nomeFormatado = NomesComPrimeirasLetrasMaiusculas(nome); string[] arrayNome = nomeFormatado.Split(' ', StringSplitOptions.RemoveEmptyEntries); // 如果名字只有1个词,直接返回 if (arrayNome.Length == 1) { return nomeFormatado; } string primeiroNome = arrayNome[0]; string sobreNome = ""; // 你的规则:如果倒数第二个词长度<4,就把倒数两个词作为姓氏 if (arrayNome.Length >= 2 && arrayNome[arrayNome.Length - 2].Length < 4) { // 合并倒数两个词为姓氏 sobreNome = $"{arrayNome[arrayNome.Length - 2]} {arrayNome[arrayNome.Length - 1]}"; } else { // 否则只取最后一个词作为姓氏 sobreNome = arrayNome[arrayNome.Length - 1]; } // 拼接结果,去掉多余空格 return $"{primeiroNome} {sobreNome}".Trim(); } } }
代码说明
- 大小写处理优化:添加了
StringSplitOptions.RemoveEmptyEntries来避免空字符串的问题(比如名字里有多个空格的情况)。 - 整合逻辑:在
ExtrairPrimeiroESobrenome方法里,先调用大小写处理方法得到格式化后的名字,再进行首名和姓氏的提取。 - 边界情况处理:考虑了名字只有一个词的情况(比如单名),避免数组越界。
- 姓氏提取规则:按照你的需求,如果倒数第二个词长度小于4,就把倒数两个词合并为姓氏(比如"da Conceição"这种情况),否则只取最后一个词。
使用示例
teste3 teste = new teste3(); var resultado = teste.ExtrairPrimeiroESobrenome("mikael da conceição souza luz"); // 输出结果:Mikael Luz var outroResultado = teste.ExtrairPrimeiroESobrenome("cleber reis pereira"); // 输出结果:Cleber Pereira(因为"reis"长度是4,不满足<4的条件) var resultadoComSobrenomeComposto = teste.ExtrairPrimeiroESobrenome("ana maria da silva"); // 输出结果:Ana da Silva(因为"da"长度<4,合并"da silva"为姓氏)
这样就完美实现了你想要的功能:从全名提取首名+姓氏,同时正确处理大小写(例外词如"da"保持小写)。
内容的提问来源于stack exchange,提问作者Mikael da Conceição Souza Luz
相关产品推荐
相关产品推荐

