按出现次数对字符串行进行排序

时间:2016-04-22 13:23:08

标签: c# string sorting duplicates

我还处于学习C#的初级阶段,我在按字符串中的出现次数对字符串进行排序时遇到了问题。

到目前为止,这是我的代码:

string[] listLines = System.IO.File.ReadAllLines(@"F:\VS\AI.xls");

Array.Sort<string>(listLines); // sort alfabeticaly
System.Console.WriteLine("History of experienced feeds:");

/*
foreach (var line in listLines) //loop to return lines in alfabetical order
{
    Console.WriteLine("\t" + line);
}
*/

// counts occurrences
var dict = new Dictionary<string, int>();

foreach (var value in listLines)
{
    if (dict.ContainsKey(value))
        dict[value]++;
    else
        dict[value] = 1;
}

foreach (var pair in dict)
    Console.WriteLine("{1} times {0}", pair.Key, pair.Value);

System.Console.WriteLine("");
System.Console.WriteLine("Press Enter to see most common feeds:");

Console.ReadKey();

/* Finds duplicates and sorts them alphabetically */
System.Console.WriteLine("Most common:");
var duplicates = listLines.GroupBy(i => i) 
                          .Where(g => g.Count() > 1)
                          .Select(g => g.Key);

foreach (var d in duplicates)
    Console.WriteLine(d);

正如您所看到的,这可以分为两部分。首先,我计算每个字符串以获得它们发生的次数。然后,我只显示那些出现不止一次的内容 - 按字母顺序排列。

我需要的是介于两者之间的东西:一种显示重复字符串的方法,但是从最少出现到大多数出现的顺序。

你能以正确的方式指导我吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

GroupBy

IGrouping<string,string>做的是选择Key中的三个。

每个分组包含Count(我们正在分组的值)和一组字符串(与该键匹配的值。)

一个键是“a”,那么分组元素的集合是[“a”,“a”],因此Count是2。 另一个关键是“b”,分组元素的集合是[“b”,“b”,“b”],因此SELECT s, count(*) from strings GROUP BY s ORDER BY count(*) DESC 是3。

这是一个字面上的解释,但我认为这听起来更复杂和令人困惑。我更愿意将其视为与

相似
log: function(type, message, content) {
    // Require and configure Winston with Loggly
    const winston = require('winston');
    require('winston-loggly');

    winston.add(winston.transports.Loggly, {
        token       : ***,    // Hiding my real token
        subdomain   : ***,
        tags        : ['sails-web-service'],
        json        :true
    });

    // Attach context to the content
    var finalContent = { timestamp: Date.now(), pid: process.pid };
    for (var attribute in content) { finalContent[attribute] = content[attribute]; }

    // Send the log
    winston.log(type, message, finalContent);
}

答案 1 :(得分:1)

将此添加到您的代码中:

foreach(var str in dict.Where(p => p.Value > 1).OrderBy(p => p.Value).Select(p => p.Key))
  Console.WriteLine(str);

答案 2 :(得分:1)

foreach(KeyValuePair kvp in dict.Where(x => x.Value > 1) 
                                .OrderByDescending(x => x.Value)) 
      Console.WriteLine(kvp.Key);

答案 3 :(得分:1)

Linq来救援:)

new [] { "A", "Be", "D", "C", "Be", "C", "D", "C"}
.GroupBy(v => v)
.Select(g => new { Value = g.Key, Count = g.Count() })
.OrderByDescending(g => g.Count)
.Select(g => g.Value)

给出:

C 
Be 
D 
A