Мне нужна помощь с этим, у меня есть строка полного имени, и мне нужно сделать это отдельно и использовать эту полную строку как имя и фамилию отдельно.
Как отделить полную строку имени от имени и фамилии?
Ответ 1
Это будет работать, если вы уверены, что у вас есть имя и фамилия.
string fullName = "Adrian Rules";
var names = fullName.Split(' ');
string firstName = names[0];
string lastName = names[1];
Убедитесь, что вы указали длину names
.
names.Length == 0 //will not happen, even for empty string
names.Length == 1 //only first name provided (or blank)
names.Length == 2 //first and last names provided
names.Length > 2 //first item is the first name. last item is the last name. Everything else are middle names
Обновление
Конечно, это довольно упрощенный взгляд на проблему. Цель моего ответа - объяснить, как работает string.Split()
. Однако вы должны помнить, что некоторые фамилии являются составными именами, такими как "Luis da Silva", как отмечает @AlbertEin.
Это далеко не простая проблема для решения. Некоторые предлоги (на французском, испанском, португальском и т.д.) Являются частью фамилии. Вот почему @Джон Сандерс спросил "какой язык?". Джон также отметил, что префиксы (г-н, г-жа) и суффиксы (младший, III, M.D.) могут мешать.
Ответ 2
Вы можете попытаться проанализировать его с помощью пробелов, но это не сработает, например:
var fullName = "Juan Perez";
var name = fullName.Substring(0, fullName.IndexOf(" "));
var lastName = fullName.Substring(fullName.IndexOf(" ") + 1);
Но это не сработает с тонны ввода пользователя, а как, если у него есть два имени? "Хуан Пабло Перес".
Имена - это сложные вещи, поэтому невозможно всегда знать, какая часть - это имя и фамилия в данной строке.
ИЗМЕНИТЬ
Вы не должны использовать метод string.Split для извлечения последней фамилии, некоторые фамилии состоят из двух или более слов, например, мой друг - "Ponce de Leon".
Ответ 3
Try:
string fullName = "The mask lol";
string[] names = fullName.Split(' ');
string name = names.First();
string lasName = names.Last();
Ответ 4
Это решение будет работать для людей с фамилией, которая имеет более одного слова. Относитесь к первому слову в качестве имени и оставляйте все остальное как фамилию.
public static string getLastNameCommaFirstName(String fullName) {
List<string> names = fullName.Split(' ').ToList();
string firstName = names.First();
names.RemoveAt(0);
return String.Join(" ", names.ToArray()) + ", " + firstName;
}
Для примера прохождение Брайана Де Пальмы в указанную выше функцию вернет "Де Пальма, Брайан"
getLastNameFirst("Brian De Palma");
//returns "De Palma, Brian"
Ответ 5
Существует несколько реализаций разбора/разделения имен в nuget. Если вы погрузитесь в репозиторий NameParserSharp, вы также можете просто объединить два частичных класса и скопировать и вставить в свою собственную библиотеку.
Ответ 6
Я бы рекомендовал использовать Regex, чтобы точно определить, как выглядят ваши первые и фамилии.
Ответ 7
Вы можете использовать эту версию (MSDN) метода Split
, например:
var testcase = "John Doe";
var split = testcase.Split(new char[] { ' ' }, 2);
В этом случае split[0]
будет John
, а split[1]
будет Deo
. другой пример:
var testcase = "John Wesley Doe";
var split = testcase.Split(new char[] { ' ' }, 2);
В этом случае split[0]
будет John
, а split[1]
будет Wesley Doe
.
Обратите внимание, что длина Split
никогда не больше 2
Итак, со следующим кодом вы можете получить FirstName
и LastName
красиво:
var firstName = "";
var lastName = "";
var split = testcase.Split(new char[] { ' ' }, 2);
if (split.Length == 1)
{
firstName = "";
lastName = split[0];
}
else
{
firstName = split[0];
lastName = split[1];
}
Надеюсь, что этот ответ добавит что-то полезное на эту страницу.
Ответ 8
Вот фрагмент кода С#, который я использую в своих проектах. Он возвращает последнее слово как фамилию, а остальное - как имя.
Вывод:
Mary Isobel Catherine O’Brien
-------------------------
Name : Mary Isobel Catherine , Surname : O’Brien
P.S. Нет среднего имени, извините.
public static string[] SplitFullNameIntoNameAndSurname(string pFullName)
{
string[] NameSurname = new string[2];
string[] NameSurnameTemp = pFullName.Split(' ');
for (int i = 0; i < NameSurnameTemp.Length; i++)
{
if (i < NameSurnameTemp.Length - 1)
{
if (!string.IsNullOrEmpty(NameSurname[0]))
NameSurname[0] += " " + NameSurnameTemp[i];
else
NameSurname[0] += NameSurnameTemp[i];
}
else
NameSurname[1] = NameSurnameTemp[i];
}
return NameSurname;
}
Ответ 9
Это так же просто, как вызов string.Split(), передавая единое пространство как разделительный символ? Или здесь что-то сложнее? (Если последний, пожалуйста, обновите свой вопрос с дополнительной информацией.)
Ответ 10
для основных случаев использования его легко разделить на "или", однако из-за разнообразия имен с разными вещами в них это не всегда будет работать.
Ответ 11
Вы можете попытаться перенести этот PHP lib https://github.com/joshfraser/PHP-Name-Parser/blob/master/parser.php
Ответ 12
Итак, если вы возьмете первое пространство как имя и останетесь как фамилия, это даст нам
Person myPerson = new Person();
Misc tidyup = new Misc();
string[] result = tidyup.SplitFullName(tb1.Text);
foreach (string s in result)
{
Console.WriteLine(s);
if (result.First() == s)
{
myPerson.FirstName = s;
}
else
{
myPerson.LastName += s + " ";
Console.WriteLine(s);
Console.WriteLine(myPerson.LastName);
}
}
public string[] SplitFullName(string myName)
{
string[] names = myName.Split(' ');
//string firstName = names[0];
//string lastName = names[1];
return names;
}