2014-09-02 92 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