在c#中,如何将字符串及其频率组合成结果字符串?
我知道我们可以找到类似这样的重复项目:在c#中,如何将字符串及其频率组合成结果字符串?,c#,algorithm,C#,Algorithm,我知道我们可以找到类似这样的重复项目: var dublicateItems = itemStrings.GroupBy(x => x) .Where(x => x.Count() > 1) .ToDictionary(g => g.Key, g => g.Count()); var distinctItems = itemStrings
var dublicateItems = itemStrings.GroupBy(x => x)
.Where(x => x.Count() > 1)
.ToDictionary(g => g.Key, g => g.Count());
var distinctItems = itemStrings.Distinct();
不同的项目如下:
var dublicateItems = itemStrings.GroupBy(x => x)
.Where(x => x.Count() > 1)
.ToDictionary(g => g.Key, g => g.Count());
var distinctItems = itemStrings.Distinct();
但如何将其组合到以下字符串列表中:
输入:a,b,b,c,d,d,d
输出:a、b(2次)、c、d(4次)
你就快到了:
var duplicateItems =
itemStrings
.GroupBy(i => i)
.Select(i => new { Key = i.Key, Count = i.Count() })
.Select(i => i.Key + (i.Count > 1 ? " (" + i.Count + " times)" : string.Empty));
如果希望结果为逗号分隔的字符串,则可以执行以下操作:
var result = string.Join(", ", duplicateItems);
比如:
string[] itemStrings = new[] { "a", "b", "b", "c", "d", "d", "d", "d" };
string[] duplicateItems = (from x in itemStrings.OrderBy(x => x).GroupBy(x => x)
let cnt = x.Count()
select cnt == 1 ?
x.Key :
string.Format("{0} ({1} times)", x.Key, cnt)
).ToArray();
我添加了一个OrderBy()
,因为您的列表似乎是有序的,我将它稍微复杂化了一点,只是为了缓存x.Count()
(让cnt=x.Count()
)
如果你想要一根大绳子,你可以
string joined = string.Join(",", duplicateItems);
您已经有了第一种方法的解决方案,请删除
Where
var itemCounts = itemStrings.GroupBy(x => x)
.ToDictionary(g => g.Key, g => g.Count());
string result = String.Join(", ",
itemCounts.Select(kv => kv.Value > 1
? string.Format("{0} ({1} times)", kv.Key, kv.Value)
: kv.Key));
另一种方法是使用Enumerable.ToLookup
而不是GroupBy
:
var itemLookup = itemStrings.ToLookup(x => x);
string result = String.Join(", ",
itemLookup.Select(grp => grp.Count() > 1
? string.Format("{0} ({1} times)", grp.Key, grp.Count())
: grp.Key));
项目字符串到底是什么
itemStrings.GroupBy(x=>x)
听起来像是做了您希望它做的事情。ToDictionary(…).ToList()
会让我产生物理错误pain@Rawling对不起,请编辑them@Anatoly呵呵,对不起,我不是很有建设性。这是我从未见过的东西!使用let
更好,你是对的。我并没有真正地使用它,因为它应该被使用:)你就快到了;你有一些空格和逗号问题。我会删除最后一个.ToList()
,并将=
的整个右侧包装成一个字符串。Join(“,…)
来告诉他他想要什么。@krillgar嗯,不清楚OP想要的是单个逗号分隔的字符串还是字符串列表。但是我会添加这个选项,好吗。@如果项目只出现一次,请添加一个尾随空格。。。但是是的,如果你选择的是一个列表而不是单个列表,逗号就不是问题string@Rawling嗯,我是个白痴:在输出中不容易看到D尾随空格…:D