我有一组字符串,如下所示:
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
我陷入了第一个障碍,即如何识别和组合前缀值相同的代码,以便我可以将它们组合成一个字符串,如上所示.
你可以做:
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并使用和原始填充匿名类型valuePrefixstring.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)
试试这个:-
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)