0

文字列を取り、それを多数の項目に分割してから、配列内に格納するメソッドに取り組んでいます。次に、配列に 3 つ以上の項目が含まれているかどうかを確認し、含まれている場合は、配列内の特定の項目を対応する文字列に割り当てます。つまり、最初の項目を名に、最後の項目を姓に、その他すべての項目をミドルネームに割り当てます。

私の問題は、最初または最後の項目ではない配列内の各項目を取得し、それらを正しい順序で文字列に割り当てることに関連しています。以下では、name 配列内の各項目を取得し、結果をリストに割り当てて単一の文字列に変換しようとしましたが、うまくいきませんでした。私が探しているのは、この問題の解決策です。

    public string SplitName(string text)
    {
        string forename;
        string middlename;
        string surname;

        var name = text.Split(' ');

        if (name != null)
        {
            if (name.Length > 2)
            {
                forename = name[0];
                surname = name[name.Length - 1];

                List<string> temp = new List<string>();

                for (int i = 1; i < name.Length - 1; i++)
                {
                    // Assign each item to middlename
                }

                text = string.Format("{0} {1} {2}", forename, middlename, surname);
            }
        }
        else
        {
            text = "INVALID";
        }

        return text;
    }
4

5 に答える 5

6

String.Join を使用する ( http://msdn.microsoft.com/en-us/library/tk0xe5h0.aspx )

public string SplitName(string text)
{
    string forename;
    string middlename;
    string surname;

    var name = text.Split(' ');

    if (name != null)
    {
        if (name.Length > 2)
        {
            forename = name[0];
            surname = name[name.Length - 1];

            middlename = string.Join(" ", name, 1, name.Length - 2);

            text = string.Format("{0} {1} {2}", forename, middlename, surname);
        }
    }
    else
    {
        text = "INVALID";
    }

    return text;
}

別の文字列を使用して結合する場合は、結合の最初のパラメーター (" ") を変更します。現在、「Bob Jack Willis Mills」という名前はミドルネーム「Jack Willis」を作成します。"Jack, Willis" が必要な場合は、区切り文字として "," を使用します。

于 2013-09-10T10:50:37.367 に答える
3

最初と最後のトークンを別々に保持し、それ以外はすべてミドル ネームとして扱いたい場合は、正規表現を使用する方がはるかに簡単です。

var regex = new Regex(@"^(\S+)\s+(?:(.*?)(?:\s+)?)(\S+)$");
var match = regex.Match("foo bar baz");

if (match.Success) {
    var firstName = match.Groups[1].Value;
    var middleName = match.Groups[2].Value;
    var lastName = match.Groups[3].Value;
}
else {
    // there were no spaces, i.e. just one token
}

正規表現は、末尾に\S+. 必要に応じてそれらの間にある他のすべてのものを pattern と一致させます(?:(.*?)(?:\s+)?)。ここで重要な部分は(.*?)(何にでも一致し、姓の前にスペースを詰め込まないために貪欲ではない)、残りはほとんどお役所仕事です (non-グループのキャプチャ、姓の前のオプションのスペース)。

于 2013-09-10T10:57:06.117 に答える
2

最初に、文字列変数を初期化する必要があります。次に、すべての「中間」項目をそれに追加できます。

    public string SplitName(string text)
    {
        string forename = string.Empty;
        string middlename = string.Empty;
        string surname = string.Empty;

        var name = text.Split(' ');

        if (name != null)
        {
            if (name.Length > 2)
            {
                forename = name[0];
                surname = name[name.Length - 1];

                List<string> temp = new List<string>();

                for (int i = 1; i < name.Length - 1; i++)
                {
                    middlename += name[i];
                }

                text = string.Format("{0} {1} {2}", forename, middlename, surname);
            }
        }
        else
        {
            text = "INVALID";
        }

        return text;
    }
于 2013-09-10T10:52:12.403 に答える