2015-06-15 2 views
2

У меня есть строка, которая имеет формат с разделителями так:Преобразовать строку с разделителями в массив и группы с помощью LINQ в C#

OrgName: Имя Фамилия, Имя Фамилия;

(это может повторяться с orgnames и переменным числом имен для каждого орг)

Пример:

**XXX University**: Martha Zander, Rick Anderson; **Albert School**: Nancy Vanderburg, Eric Towson, George Branson; **Hallowed Halls**: Jane Goodall, Ann Crabtree, Rick Grey, Tammy Hudson; 

Полученная строка должна быть сгруппированы и отсортированы по ORGNAME, а затем ЬавЬЫате как это:

**Albert School**: George Branson, Eric Towson, Nancy Vanderburg; 
**Hallowed Halls**: Ann Crabtree, Jane Goodall, Rick Grey, Tammy Hudson; 
**XXX University**: Rick Anderson, Martha Zander; 

Я получил это далеко:

string[][] splitThis = staff.Split(';').Select(s => s.Split(':')).ToArray(); 

Это дает мне массив, разделенный orgname, а затем я застрял после этого.

Я знаю, что мне нужен многомерный массив с именем, именем, фамилией, но я не знаю, как заполнять, группировать и сортировать, чтобы получить правильный результат.

+0

Почему бы не использовать отсортированный словарь? – deathismyfriend

+0

Есть ли вероятность, что у вас будет человек, у которого нет ровно двух частей на свое имя? Как «Мэри Джейн Уотсон» или «Дейл Эрнхардт-младший»? –

+1

Как вы определяете * lastname. У вас есть люди с несколькими именами или с несколькими фамилиями. Как «Уильям Басквиль», «Влад Импалер» и «Мари Роуз Фу». –

ответ

2
public static void Main() 
{ 
    var input = 
    @"**Albert School**: George Branson, Eric Towson, Nancy Vanderburg; 
    **Hallowed Halls**: Ann Crabtree, Jane Goodall, Rick Grey, Tammy Hudson; 
    **XXX University**: Rick Anderson, Martha Zander;"; 

    var universities = input 
         .Split(';') 
         .Select(ParseUniversity) 
         .ToArray(); 
} 

public static University ParseUniversity(string line) 
{ 
    var fields = line 
       .Split(',',':') 
       .Select(f=>f.Trim('*','\n','\r', '\t' ,' ')) // remove trailing crap 
       .ToArray(); 

    var universityName = fields.First(); 

    var persons = fields 
       .Skip(1) // skip university field 
       .Select(ParsePerson) 
       .ToArray(); 

    return new University {Name = universityName, Persons = persons}; 
} 

public static Person ParsePerson(string field) 
{ 
    var p = field.Split(' '); 
    return new Person{FirstName = p.First(), LastName = p.Last()}; 
} 

public class University 
{ 
    public string Name {get;set;} 
    public Person[] Persons {get;set;} 
} 

public class Person 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 
+1

Это то, что мне нужно! Данные теперь прекрасно организованы. Миллион спасибо за то, что нашли время, чтобы помочь мне. – PegR

1

Я хотел бы использовать регулярное выражение здесь

string input = @"**XXX University**: Martha Zander, Rick Anderson; **Albert School**: Nancy Vanderburg, Eric Towson, George Branson; **Hallowed Halls**: Jane Goodall, Ann Crabtree, Rick Grey, Tammy Hudson;"; 
var dict = Regex.Matches(input, @"\*\*(.+?)\*\*: (.+?);") 
      .Cast<Match>() 
      .ToDictionary(x => x.Groups[1].Value, x=>x.Groups[2].Value.Split(',')); 

dict будет (в формате JSON):

{ 
    "XXX University": [ 
    "Martha Zander", 
    " Rick Anderson" 
    ], 
    "Albert School": [ 
    "Nancy Vanderburg", 
    " Eric Towson", 
    " George Branson" 
    ], 
    "Hallowed Halls": [ 
    "Jane Goodall", 
    " Ann Crabtree", 
    " Rick Grey", 
    " Tammy Hudson" 
    ] 
} 
+1

Благодаря @EZI, это помогает анализировать данные в формате json, но мне нужно отсортировать его и сгруппировать по org, а затем отсортировать по фамилии. Это хороший урок для меня, как эффективно использовать словарь и регулярное выражение. Я ценю это! – PegR

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