识别字符串集合中的类似项目并对其进行分组

Cia*_*her 1 .net c# linq

我有一组字符串,如下所示:

List<string> codes = new List<string>
{
    "44.01", "44.02", "44.03", "44.04", "44.05", "44.06", "44.07", "44.08", "46", "47.10"
};
Run Code Online (Sandbox Code Playgroud)

每个字符串由两个由句号分隔的组件组成 - 前缀代码和子代码.一些字符串没有子代码.

我希望能够组合前缀相同的字符串,并将其输出如下,其他代码也是:

44(01,02,03,04,05,06,07,08),46,47.10

我陷入了第一个障碍,即如何识别和组合前缀值相同的代码,以便我可以将它们组合成一个字符串,如上所示.

Hab*_*bib 5

你可以做:

var query = codes.Select(c => 
    new
    {
        SplitArray = c.Split('.'),  //to avoid multiple split
        Value = c
    })
    .Select(c => new
    {
        Prefix = c.SplitArray.First(), //you can avoid multiple split if you split first and use it later
        PostFix = c.SplitArray.Last(),
        Value = c.Value,
    })
    .GroupBy(r => r.Prefix)
    .Select(grp => new
    {
        Key = grp.Key,
        Items = grp.Count() > 1 ? String.Join(",", grp.Select(t => t.PostFix)) : "",
        Value = grp.First().Value,
    });
Run Code Online (Sandbox Code Playgroud)

这是它的工作原理:

  • 拆分分隔符上列表中的每个项目Prefix,Postfix并使用和原始填充匿名类型value
  • 后来小组 Prefix
  • 之后,使用选择值和后固定值 string.Join

输出:

foreach (var item in query)
{
    if(String.IsNullOrWhiteSpace(item.Items))
        Console.WriteLine(item.Value);
    else
        Console.WriteLine("{0}({1})", item.Key, item.Items);
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

44(01,02,03,04,05,06,07,08)
46
47.10
Run Code Online (Sandbox Code Playgroud)


Rah*_*ngh 5

试试这个:-

 var result = codes.Select(x => new { SplitArr = x.Split('.'), OriginalValue = x })
                   .GroupBy(x => x.SplitArr[0])
                   .Select(x => new 
                    {
                       Prefix= x.Key,
                       subCode = x.Count() > 1 ? 
                             String.Join(",", x.Select(z => z.SplitArray[1])) : "",
                       OriginalValue = x.First().OriginalValue
                    });
Run Code Online (Sandbox Code Playgroud)

您可以像这样打印所需的输出: -

foreach (var item in result)
{
     Console.Write("{0}({1}),",item.Prefix,item.subCode);
}
Run Code Online (Sandbox Code Playgroud)

工作小提琴.