You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并去除全名中间名与首字母大写功能?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:20:25