C# 获取显示名称的首字母

C# Get Initials of DisplayName

我正在尝试从显示名称中提取首字母以用于显示他们的首字母。 我发现这很难,因为字符串是一个包含一个或多个单词的值。我怎样才能做到这一点?

示例:

'John Smith' => JS

'Smith, John' => SJ

'John' => J

'Smith' => S

public static SearchDto ToSearchDto(this PersonBasicDto person)
        {
            return new SearchDto
            {
                Id = new Guid(person.Id),
                Label = person.DisplayName,
                Initials = //TODO: GetInitials Code
            };
        }

我使用了以下解决方案:我创建了一个辅助方法,它允许我测试多个案例。

public static string GetInitials(this string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                return string.Empty;
            }

            string[] nameSplit = name.Trim().Split(new string[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
            var initials = nameSplit[0].Substring(0, 1).ToUpper();

            if (nameSplit.Length > 1)
            {
                initials += nameSplit[nameSplit.Length - 1].Substring(0, 1).ToUpper();
            }

            return initials;
        }

下面的怎么样:

   void Main()
{
    Console.WriteLine(GetInitials("John Smith"));
    Console.WriteLine(GetInitials("Smith, John"));
    Console.WriteLine(GetInitials("John"));
    Console.WriteLine(GetInitials("Smith"));
}

private string GetInitials(string name)
{
    if (string.IsNullOrWhiteSpace(name))
    {
        return string.Empty;
    }
    var splitted = name?.Split(' ');
    var initials = $"{splitted[0][0]}{(splitted.Length > 1 ? splitted[splitted.Length - 1][0] : (char?)null)}";
    return initials;
}

输出:

JS - SJ - J - S

代码简单易懂,可处理包含名字、中间名和姓氏的名称,例如“John Smith William”。

 Console.WriteLine(GetInitials("John Smith"));  // JS
 Console.WriteLine(GetInitials("Smith, John")); // SJ
 Console.WriteLine(GetInitials("John"));        // J
 Console.WriteLine(GetInitials("Smith"));       // S

 Console.WriteLine(GetInitials("John Smith William"));   // JSW


 static string GetInitials(string name)
    {                       
        // StringSplitOptions.RemoveEmptyEntries excludes empty spaces returned by the Split method

        string[] nameSplit = name.Split(new string[] { "," , " "}, StringSplitOptions.RemoveEmptyEntries);
                    
        string initials = "";

        foreach (string item in nameSplit)
        {                
            initials += item.Substring(0, 1).ToUpper();
        }

        return initials;           
    }

或者作为 扩展方法 的另一种变体,带有少量完整性检查

给定

public static class StringExtensions
{
   public static string GetInitials(this string value)
      => string.Concat(value
         .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
         .Where(x => x.Length >= 1 && char.IsLetter(x[0]))
         .Select(x => char.ToUpper(x[0])));
}

用法

var list = new List<string>()
{
   "James blerg Smith",
   "Michael Smith",
   "Robert Smith 3rd",
   "Maria splutnic Garcia", 
   "David Smith", 
   "Maria Rodriguez",
   "Mary Smith", 
   "Maria Hernandez"
};

foreach (var name in list)
   Console.WriteLine(name.GetInitials());

输出

JBS
MS
RS
MSG
DS
MR
MS
MH

Full Demo Here

以下代码来自here。代码所做的是从字符串中取出每个单词的第一个字母并将其输出为大写字母。

   static void printInitials(String name) 
    { 
        if (name.Length == 0) 
            return; 
  
        // Since touuper() returns int, 
        // we do typecasting 
        Console.Write(Char.ToUpper(name[0])); 
  
        // Traverse rest of the string and  
        // print the characters after spaces. 
        for (int i = 1; i < name.Length - 1; i++) 
            if (name[i] == ' '&((i + 1)!=name.Length)) 
                Console.Write(" " + Char.ToUpper(name[i + 1])); 
    }