2014-09-02 93 views
1

我有名字的下面的列表:分割字符串轉換成較小的字符串

List<string> names = new List<string>(); 
names.Add("Tom Example"); 
names.Add("Ron Example"); 
names.Add("Peter Pavel Example"); 
names.Add("Pavel Ron Tom Example"); 

我想分割在較小的字符串字符串列表中的每個元素:

string firstName; 
string firstInitial; 
string lastName; 
string lastInitial; 
string secondName; 
string secondInitial; 

我想這樣做方法循環becouse我想在這些小字符串上做一些事情。如果我在字符串中有3個姓氏和姓氏,我只想要第一個和第二個姓氏。對於間隙:

對於列表的最後一個元素,我想有一個結果:

string firstName == Pavel; 
string firstInitial == P; 
string lastName == Example; 
string lastInitial == E; 
string secondName == Ron; 
string secondInitial == R; 

我不知道如何實現這個問題才能正常工作。有任何想法嗎?爲自己

+0

你怎麼能可靠地說第二個字符串不是姓,但最初? – Tigran 2014-09-02 10:05:01

+0

計算字符串中有多少單詞(要查看他是否有兩個名字或只有一個名字),分割它們,使用分割字符串作爲分割字符串,然後完成。 – DatRid 2014-09-02 10:05:14

+0

我從數據庫中獲取字符串,所以總是姓氏是最後一個世界。 – Sowiarz 2014-09-02 10:06:38

回答

3

我已經準備了以下解決方案:

public enum NameOptions 
{ 
    FirstName = 1, 
    MiddleName = 2, 
    LastName = 4 
}; 

然後擴展:

public static string SafeTokenPosition(this string @string, int index) 
{ 
    if (string.IsNullOrEmpty(@string)) 
    { 
     return string.Empty; 
    } 

    var tokens = @string.Split(new[] { " " }, 
           StringSplitOptions.RemoveEmptyEntries); 
    return index >= tokens.Length ? string.Empty : tokens[index]; 
} 

private static string ResolveLastName(string name) 
{ 
    if (string.IsNullOrWhiteSpace(name)) 
    { 
     return string.Empty; 
    } 

    var tokens = name.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

    switch (tokens.Length) 
    { 
     case 2: 
      return tokens[1]; 
     case 3: 
      return tokens[2]; 
     default: 
      return string.Empty; 
    } 
} 

private static string ResolveMiddleName(string name) 
{ 
    if (string.IsNullOrWhiteSpace(name)) 
    { 
     return string.Empty; 
    } 

    var tokens = name.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

    switch (tokens.Length) 
    { 
     // ex. John Pablo Kowalsky 
     case 3: 
      return tokens[1]; 
     default: 
      return string.Empty; 
    } 
} 

private static string ResolveFirstName(string name) 
{ 
    return name.SafeTokenPosition(0); 
} 

和最終擴展:

public static string ExtractName(this string @string, NameOptions nameOptions) 
{ 

    switch (nameOptions) 
    { 
     case NameOptions.FirstName: 
      return ResolveFirstName(@string); 
     case NameOptions.MiddleName: 
      return ResolveMiddleName(@string); 
     case NameOptions.LastName: 
      return ResolveLastName(@string); 
     default: 
      throw new NotSupportedException("Name " + nameOptions + " is not supported."); 
    } 
} 

用法:

var firstName = "John Sample".ExtractName(NameOptions.FirstName); 

應該很容易擴展來處理首字母和兩秒的名字。

+0

「name.SafeTokenPosition(0)」字符串不包含的定義。 「Condition.Requiers(...)」條件在當前上下文中不存在。 – Sowiarz 2014-09-02 10:38:03

+0

我第一次嘗試令牌,所以我需要時間來學習令牌。抱歉,我的答案很慢。 – Sowiarz 2014-09-02 10:39:50

+0

只需刪除該行。它的外部庫用於無效性檢查。你可以寫簡單的if。 – 2014-09-02 10:45:47