如何解决在C#数组中对字符串进行分组和计数
假设我有以下字符串列表:
"1130-CD-001"
"1130-CD-001A"
"1130-CD-001B"
"1130-CD-001C"
"1130-CD-002"
"1130-CD-002A"
"1130-CD-003"
"1130-CD-003A"
"1130-CD-003B"
如何在C#中处理该列表以获取以下汇总
Item Count
"1130-CD-001" 1
"1130-CD-001A,B,C" 3
"1130-CD-002" 1
"1130-CD-002A" 1
"1130-CD-003" 1
"1130-CD-003A,B" 2
提前谢谢!
解决方法
您可以将其转换为这样的字典:
var dict = list.GroupBy(x => Regex.Replace(x,@"[A-Z]+$","_"))
.ToDictionary(
grp => grp.Key
.Replace("_",string.Join(",",grp.Select(x => Regex.Match(x,@"[A-Z]+$")))),grp => grp.Count());
Regex用_
替换所有结尾的A-Z字符以创建分组。
然后通过将_
替换为每个组中尾随A-Z字符的列表来创建密钥。
示例:https://dotnetfiddle.net/OTiRLE
,由于您将非后缀与后缀分开分组的规则,这有点棘手-但这可行:
var result = input.GroupBy(x => char.IsLetter(x.Last()) ? (x.Substring(0,x.Length-1),true) : (x,false))
.Select(g => new {
Text = g.Key.Item2 ? g.Key.Item1 + String.Join(",g.Select(x => x.Last())) : g.Key.Item1,Count = g.Count()
});
实时示例:https://dotnetfiddle.net/CVgmRB
上面的方法是将其分组为一个看起来像(string Key,bool HasSuffix)
的元组,然后使用该分组来投影所需的文本和计数。
检查
var list = new string[]{"1130-CD-001","1130-CD-001A","1130-CD-001B","1130-CD-001C","1130-CD-002","1130-CD-002A","1130-CD-003","1130-CD-003A","1130-CD-003B",};
list.Select(x => new { Orj = x,Base = x.Substring(0,11),Rest = x.Substring(11) })
.GroupBy(x => new { Key1 = x.Base,Key2 = String.IsNullOrWhiteSpace(x.Rest)})
.Select(x =>
{
return new { x.Key.Key1,Val = String.Join(',',x.Select(p => p.Rest)) };
})
.Dump();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。