简体   繁体   English

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

[英]Convert delimited string to array and group using LINQ in C#

I have a string that has a delimited format like this: 我有一个具有分隔格式的字符串,如下所示:

orgname : firstname lastname, firstname lastname; orgname :名字姓氏,名字姓氏;

(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. 我知道我需要一个包含orname,firstname,lastname的多维数组,但是我不知道如何填充,分组和排序它以获得正确的结果。

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;}
}

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): 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"
  ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM