C #: параметризованная строка с пробелами только между «полными» параметрами?

2

Я хочу вывести строку, которая приветствует пользователя приложения. У меня есть первая, средняя и фамилия пользователя. Я хотел бы написать полное имя пользователя, т.е. "Hello {0} {1} {2}" с первым, средним и последним параметрами. Однако, если среднее имя пустое, мне не нужны два пробела между первой и последней именами, а всего лишь одно пространство. Я, очевидно, могу сделать это с помощью "if", но есть ли более элегантный способ достичь этого?

Спасибо

Теги:
string

6 ответов

3
Лучший ответ
string.Format("{0} {1} {2}", first, middle, last).Replace("  "," ")
  • 0
    Мне нравится этот самый лучший. Я мог бы использовать «Привет» + ваше решение.
2

Возможно, стоит создать класс Name, у которого есть свойство Full, которое позаботится об этой логике (т.е. напечатает "John Smith", если нет среднего имени или "John A. Smith", если есть).

Тогда ваш код будет выглядеть следующим образом:

var name = new Name(first, middle, last);
var message = string.Format("Hello {0}", name.Full);

Вы также можете рассмотреть возможность добавления свойства LastFirstMiddle (чтобы получить форматированную строку "Smith, John A.") и любых других свойств, которые имели бы смысл с классом Name.

2
"Hello {0} {1}{3}{2}"

где

{3} = param1.IsNullOrEmpty() ? "" : " "
  • 0
    это все еще дает вам 2 пробела?
  • 0
    @Jimmy: пробелы являются условными для параметра в позиции {1} .. поэтому нет, вы не получите 2 пробела, если param1 равен нулю или пуст.
Показать ещё 3 комментария
0

Я использовал этот метод в своих проектах. и это помогает много.

public string LogicFullName(string fName)
    {
        string logicName = String.Empty;
        string[] splitFullName = fName.Trim().Split(' ');
        for (int i = 0; i < splitFullName.Length; i++)
        {
            if (logicName == String.Empty && i == 0)
            {
                logicName = splitFullName[i].Trim();
            }
            else
            {
                if (splitFullName[i] != String.Empty)
                    logicName = logicName + " " + splitFullName[i].Trim();
            }
        }
        return logicName;
     }
0
var hello =
    (from name in new[] { "Hello", firstName, middleName, lastName }
     where !string.IsNullOrEmpty(name))
     .Aggregate((xs, x) => xs + " " + x);

или

var hello = string.Join(" ", 
    (from name in new[] { "Hello", firstName, middleName, lastName }
     where !string.IsNullOrEmpty(name))
     .ToArray());
  • 1
    Если у вас есть золотой молоток, все выглядит как гвоздь, верно? :-) Если серьезно, разве вы не согласны с тем, что этот синтаксис запутывает намерение, а не делает его читаемым?
  • 0
    Я думал о том же.
0

Один из способов добиться этого - поместить пространство в строку параметров. Например (только первое и последнее имя в качестве примера)

Console.WriteLine("Hello {0}{1}{2}",
  firstName,
  String.IsNullOrEmpty(firstName) ? String.Empty : " ", 
  lastName);
  • 0
    где второе имя?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню