按排名顺序显示文本文件中的行

时间:2011-12-19 00:10:16

标签: c# .net-3.0

我有一个文本文件,其中包含多行,其中许多是重复的。

我想描绘一个列表,其中出现最多的列表出现在顶部,最少出现在底部。

但是,我想显示字符串在列表中旁边显示的次数。

我将如何做到这一点?

3 个答案:

答案 0 :(得分:0)

快速'n'简单的方法是使用Dictionary和循环:

using(StreamReader sr = new StreamReader("my file")) {
    Dictionary<string, int> items = new Dictionary<string, int>();

    while(sr.BaseStream.Position < sr.BaseStream.Length) {
        string s = sr.ReadLine();
        if(items.ContainsKey(s)) {
            items[s]++;
        } else {
            items.Add(s, 1);
        }
    }

    // You now have a dictionary of unique strings and their counts - you can sort it however you need.
}

答案 1 :(得分:0)

如果文件不是太大,即,如果它可以放在内存中,你可以将它存储在字典中。

制作“文字行”字典 - &gt; “它被看到的次数”

一次读取一行文件。如果该行已在字典中,则将字典值增加1。如果该行是新的,请将其添加到字典中并将值设置为1。

读取整个文件后,您可以拉出键/值。按值排序以查找最常出现的值并打印结果。

答案 2 :(得分:0)

.NET Framework 3.0的代码:

using System;
using System.IO;
using System.Collections.Generic;

public class Program
{
  private static int Compare(KeyValuePair<string, int> kv1, KeyValuePair<string, int> kv2)
  {
    return kv2.Value == kv1.Value ? kv1.Key.CompareTo(kv2.Key) : kv2.Value - kv1.Value;
  }

  public static void Main()
  {
    Dictionary<string, int> histogram = new Dictionary<string, int>();
    using (StreamReader reader = new StreamReader("Test.txt"))
    {
      string line;
      while ((line = reader.ReadLine()) != null)
      {
        if (histogram.ContainsKey(line))
          ++histogram[line];
        else
          histogram.Add(line, 1);
      }
    }

    List<KeyValuePair<string, int>> sortedHistogram = new List<KeyValuePair<string, int>>(histogram);
    sortedHistogram.Sort(Compare);
    foreach (KeyValuePair<string, int> kv in sortedHistogram)
      Console.WriteLine("{0}\t{1}", kv.Value, kv.Key);
  }
}

Test.txt的:

ddd
aaa
ccc
bbb
aaa
aaa
bbb

输出:

3   aaa
2   bbb
1   ccc
1   ddd