2014-09-02 2 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; 

Я хочу сделать этот метод loop becouse Я хочу кое-что сделать на этих маленьких струнах. И если у меня есть 3 имени и фамилии в строке, я хочу иметь только первое и второе имя и фамилию. Для оформления:

Для последнего элемента списка Я хочу, чтобы этот результат:

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

Я понятия не имею, как реализовать эту проблему, чтобы правильно работать. Есть идеи?

+0

Как вы можете с уверенностью сказать, что вторая строка не является фамилией, а исходной? – Tigran

+0

Подсчитайте, сколько слов в строке (чтобы узнать, есть ли у него два первых имени или только один), разделите их, используйте подстроку для разделенных строк, и все готово. – DatRid

+0

Я беру строки из базы данных, поэтому всегда фамилия - это последний мир. – Sowiarz

ответ

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)» строка не содержит определения. «Условие.Requiers (...)« Условие не exixt в текущем контексте. – Sowiarz

+0

Я первый раз пробовал токены, поэтому мне нужно время, чтобы узнать токены. Так жаль моих медленных ответов. – Sowiarz

+0

Просто удалите эту линию. Его внешняя библиотека для проверки недействительности. Вы можете написать просто, если. – 2014-09-02 10:45:47

Смежные вопросы