Reputation: 35
I have a string that has a delimited format like this:
orgname: firstname lastname, firstname lastname;
(this can repeat with orgnames and variable number of names for each org)
Example:
**XXX University**: Martha Zander, Rick Anderson; **Albert School**: Nancy Vanderburg, Eric Towson, George Branson; **Hallowed Halls**: Jane Goodall, Ann Crabtree, Rick Grey, Tammy Hudson;
The resultant string needs to be grouped and sorted by orgname and then lastname like this:
**Albert School**: George Branson, Eric Towson, Nancy Vanderburg;
**Hallowed Halls**: Ann Crabtree, Jane Goodall, Rick Grey, Tammy Hudson;
**XXX University**: Rick Anderson, Martha Zander;
I have gotten this far:
string[][] splitThis = staff.Split(';').Select(s => s.Split(':')).ToArray();
This gives me an array split up by orgname and then I am stuck after this.
I know I need a multidimensional array with orname, firstname, lastname but I don't know how to populate, group and sort it to get the proper result.
Upvotes: 2
Views: 803
Reputation: 5074
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;}
}
Upvotes: 2
Reputation: 15364
I would use a regex here
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
would be (in 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"
]
}
Upvotes: 1