【问题标题】:Convert delimited string to array and group using LINQ in C#在 C# 中使用 LINQ 将分隔字符串转换为数组和组
【发布时间】:2015-08-31 12:36:01
【问题描述】:

我有一个带有分隔格式的字符串,如下所示:

组织名:名姓氏,名姓姓氏;

(这可以与组织名称和每个组织的可变名称重复)

例子:

**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 的多维数组,但我不知道如何填充、分组和排序以获得正确的结果。

【问题讨论】:

  • 为什么不使用排序字典?
  • 您是否有可能遇到一个姓名不完全由两部分组成的人?喜欢Mary Jane WatsonDale Earnhardt Jr.
  • 你如何定义姓氏。您有多个名字或多个姓氏的人。像“巴斯克维尔的威廉”、“穿刺者弗拉德”和“玛丽·罗斯·福”。
  • 为什么需要多维数组?这似乎是定义类的最佳时机(例如PersonOrganization)。
  • 不幸的是,客户以这种格式提供给我们的数据都是手动输入到数据库的一个字段中的 (sigh)。我们被告知要尽可能对它进行分类以进行展示。因此,可能有多个名字或姓氏,但我认为没有办法确定和调整这一点。 @ryanyuyu

标签: c# arrays linq csv


【解决方案1】:
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;}
}

【讨论】:

  • 这正是我所需要的!数据现在组织得很好。一百万感谢您花时间帮助我。
【解决方案2】:

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

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

【讨论】:

  • 感谢@EZI,这有助于将数据解析为 json 格式,但我需要将其按组织排序和分组,然后按姓氏排序。如何有效地使用字典和正则表达式对我来说是一个很好的教训。我很感激!
猜你喜欢
  • 2022-01-07
  • 2019-08-23
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多