私はこれに関するいくつかの助けが必要です、私はフルネーム文字列を持っています、そして私がする必要があるのは別々で、このフルネーム文字列をファーストネームとラストネームとして別々に使用します。
これは、名と姓があることが確実な場合に機能します。
_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()
がどのように機能するかを説明することです。ただし、一部の姓は、@ AlbertEinで指摘されているように、「Luis da Silva」のような合成名であることに留意する必要があります。
これは単純な解決すべき問題ではありません。いくつかの前置詞(フランス語、スペイン語、ポルトガル語など)は姓の一部です。 @John Saundersが「どの言語ですか?」と尋ねたのはそのためです。ジョンはまた、接頭辞(Mr.、Mrs。)と接尾辞(Jr.、III、M.D。)が邪魔になるかもしれないと述べました。
スペースを使用して解析することもできますが、機能しません。例:
var fullName = "Juan Perez";
var name = fullName.Substring(0, fullName.IndexOf(" "));
var lastName = fullName.Substring(fullName.IndexOf(" ") + 1);
しかし、それは大量のユーザー入力で失敗します。2つの名前がある場合はどうでしょうか。 「フアン・パブロ・ペレス」。
名前は複雑なものなので、特定の文字列のどの部分が姓と名であるかを常に把握することはできません。
[〜#〜] edit [〜#〜]
String.Splitメソッドを使用して姓を抽出しないでください。一部の姓は2つ以上の単語で構成されます。たとえば、私の友人の姓は「Ponce de Leon」です。
このソリューションは、複数のWordを持つ姓を持つ人に有効です。最初のWordを名として扱い、他のすべてを姓として残します。
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;
}
たとえば、上記の関数にBrian De Palmaを渡すと、「De Palma、Brian」が返されます。
getLastNameFirst("Brian De Palma");
//returns "De Palma, Brian"
試してください:
string fullName = "The mask lol";
string[] names = fullName.Split(' ');
string name = names.First();
string lasName = names.Last();
このバージョン(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];
}
この回答がこのページに役立つものを追加することを願っています。
Regex を使用して、姓と名がどのように見えるかを厳密に定義することをお勧めします。
Nugetには、名前の解析/分割の実装がいくつかあります。 NameParserSharpリポジトリに飛び込む場合は、2つの部分クラスを組み合わせて、独自のライブラリにコピーして貼り付けることもできます。
プロジェクトで使用するc#コードの一部を次に示します。最後の単語を姓として、残りを名前として返します。
出力:
Mary Isobel Catherine O’Brien
-------------------------
Name : Mary Isobel Catherine , Surname : O’Brien
追伸ミドルネームはありません、ごめんなさい。
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;
}
これは string.Split() を呼び出して、単一のスペースを分割文字として渡すのと同じくらい簡単ですか?それともここで起こっているもっとトリッキーなことがありますか? (後者の場合は、質問を詳細情報で更新してください。)
基本的な使用例では、「」または「」で簡単に分割できますが、名前がさまざまであるため、それらが異なるため、常に機能するとは限りません。
これを移植してみることができますPHP lib https://github.com/joshfraser/PHP-Name-Parser/blob/master/parser.php
最初のスペースを名前、残りを姓とすると、次のようになります。
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;
}
Flowers、LoveからLove Flowersのようなものを変換する簡単でシンプルなコード(これはWilliams Jones、Rupert Johnなどの非常に複雑な名前で動作します) :
string fullname = "Flowers, Love";
string[] fullnameArray = fullname.Split(",");//Split specify a separator character, so it's removed
for (int i = fullnameArray.Length - 1; i >= fullnameArray.Length - 2; i--)
{
Write($"{fullnameArray[i].TrimStart() + " "}");
}
出力:Love Flowers
逆に。花に変換された愛の花、愛:
string fullname = "Love Flowers";
int indexOfTheSpace = fullname.IndexOf(' ');
string firstname = fullname.Substring(0, indexOfTheSpace);
string lastname = fullname.Substring(indexOfTheSpace + 1);
WriteLine($"{lastname}, {firstname}");