C# 在C中使用LINQ将分隔字符串转换为数组和组#

C# 在C中使用LINQ将分隔字符串转换为数组和组#,c#,arrays,linq,csv,C#,Arrays,Linq,Csv,我有一个字符串,其分隔格式如下: **Albert School**: George Branson, Eric Towson, Nancy Vanderburg; **Hallowed Halls**: Ann Crabtree, Jane Goodall, Rick Grey, Tammy Hudson; **XXX University**: Rick Anderson, Martha Zander; orgname:firstname lastname,firstname lastn

我有一个字符串,其分隔格式如下:

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

(对于每个组织,可以重复使用组织名和可变数量的名称)

例如:

**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和lastname进行分组和排序,如下所示:

**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分割的数组,然后我就被困在这之后了


我知道我需要一个包含orname、firstname、lastname的多维数组,但我不知道如何填充、分组和排序以获得正确的结果。

我会在这里使用正则表达式

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(','));

为什么不使用分类词典呢?你有没有可能遇到一个名字中没有两部分的人?像玛丽·简·沃森或小戴尔·恩哈特?你如何定义姓氏。您有多个名字或多个姓氏的人。比如“巴斯克维尔的威廉”,“穿刺者弗拉德”和“玛丽·罗斯·福”。你为什么需要多维数组?这似乎是定义类(如
Person
Organization
)的最佳时机。不幸的是,客户以这种格式向我们提供了数据,这些数据都是手工输入到数据库的一个字段中的(叹气)。我们被告知要尽可能把它分类以便展示。因此,可能会有多个名字或姓氏,但我不认为会有一种方法来确定和调整这一点@Ryanyuuthanks@EZI,这有助于将数据解析为json格式,但我需要按组织对其进行排序和分组,然后按姓氏排序。这对我来说是一堂如何有效使用字典和正则表达式的好课。我很感激!这正是我需要的!数据现在组织得很好。非常感谢你抽出时间来帮助我。
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;}
}