Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中,如何将字符串及其频率组合成结果字符串?_C#_Algorithm - Fatal编程技术网

在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