C# 使用按相同属性分组的对象创建字符串

C# 使用按相同属性分组的对象创建字符串,c#,linq,C#,Linq,我有一个具有以下属性的类: public class Party { public string Type { get; set; } public string Name { get; set; } } 此方法用于填充列表: List<Party> parties = new List<Party>(); parties.Add(new Party {Type = "Plaintiff", Name = "Eilean Dover"}); partie

我有一个具有以下属性的类:

public class Party
{
    public string Type { get; set; }
    public string Name { get; set; }
}
此方法用于填充列表:

List<Party> parties = new List<Party>();
parties.Add(new Party {Type = "Plaintiff", Name = "Eilean Dover"});
parties.Add(new Party {Type = "Plaintiff", Name = "Bea O'Problem"});
parties.Add(new Party {Type = "Defendant", Name = "Anna Graham"});
parties.Add(new Party {Type = "Witness", Name = "John Doe"});
parties.Add(new Party {Type = "Witness", Name = "Rosa Shore"});
运行此操作后,字符串
partiesinline
如下所示:

Plaintiff Eilean Dover, Plaintiff Bea O'Problem, Defendant Anna Graham, Witness John Doe, Witness Rosa Shore
Plaintiffs Eilean Dover, Bea O'Problem, Defendant Anna Graham and Witnesses John Doe, Rosa Shore
我的进一步改进是按类型对当事人进行分组,如果有更多相同类型的当事人,则以复数形式进行分组。 理想情况下,字符串应如下所示:

Plaintiff Eilean Dover, Plaintiff Bea O'Problem, Defendant Anna Graham, Witness John Doe, Witness Rosa Shore
Plaintiffs Eilean Dover, Bea O'Problem, Defendant Anna Graham and Witnesses John Doe, Rosa Shore
我可以使用字典或列表来获取该类型的plurar,但我一直坚持将参与方分组,并在partiesinline字符串中为具有相同名称的参与方保留单个类型。 你有什么解释的建议吗


我已经阅读了,但是我被卡住了,我无法识别步骤以获得所需的结果。

您需要多次调用
string.Join
。考虑:

  • 您希望将每个组的单个名称合并为每个组的一个字符串
  • 然后您希望将从每个组生成的字符串组合成一个字符串
  • GroupBy
    方法有一个重载,它不仅允许您指定分组依据:

    party => party.Type
    
    但各组的中间结果;在本例中,单个字符串:

    (type, group) => $"{type} {String.Join(", ", group.Select(party => party.Name))}"
    
    var result = string.Join(",", grouping);
    
    • type
      是每个组的分组依据(在本例中为
      type
      属性中的值)
    • group
      Party
      的分组实例,我们可以将其
      Name
      属性投影到一系列字符串(
      group.Select(Party=>Party.Name
      ),然后我们可以使用
      string.join
      将其加入到单个字符串中
    总共:

    var grouping = parties.GroupBy(
        party => party.Type,
        (type, group) => $"{type} {String.Join(", ", group.Select(party => party.Name))}"
    );
    
    分组
    现在可以为我们提供一系列字符串,我们可以再次使用
    字符串。加入
    创建单个字符串:

    (type, group) => $"{type} {String.Join(", ", group.Select(party => party.Name))}"
    
    var result = string.Join(",", grouping);
    

    至于类型的多元化,我认为您通常可以添加一个
    s
    ,但将此规则的例外情况放在
    字典中

    并按如下方式使用:

    var grouping = parties.GroupBy(
        party => party.Type,
        (type, group) => $"{Pluralize(type)}: {String.Join(", ", group.Select(party => party.Name))}"
    );
    var result = string.Join("; ", grouping);
    
    这将产生以下结果:

    Plaintiffs: Eilean Dover, Bea O'Problem; Defendants: Anna Graham; Witnesses: John Doe, Rosa Shore
    

    给定一个可以查找复数的词典:

    Dictionary<string,string> plurals = new Dictionary<string,string>{
        ["Plaintiff"] = "Plaintiffs",
        ["Defendant"] = "Defendants",
        ["Witness"] = "Witnesses"
    };
    

    实例:

    尽管Jamiec提供的答案对于我的测试来说已经足够了,但您的答案中有详细的步骤,并且是供进一步使用的良好文档。谢谢!