使用StreamReader计算重复项?

时间:2011-11-10 12:10:33

标签: c# streamreader

我现在正在使用streamreader来读取人名的文件,它是一个人名的文本文件,所以显然有重复,我希望能够显示现在有多少人拥有相同的名字例如:

josh
alex
josh
john
alex

我希望它说,

josh 2
alex 2
john 1

但我似乎无法找到一种简单的方法,这样做最简单的方法,

7 个答案:

答案 0 :(得分:1)

我要说使用Dictionary<string, int>

Dictionary<string, int> firstNames = new Dictionary<string, int>();

foreach (string name in YourListWithNames)
{
   if (!firstNames.ContainsKey(name))
      firstNames.Add(name, 1);
   else
      firstNames[name] += 1; 
}

当然,解决方案有很多不同的途径,但这就是我要解决的问题。我还没有运行此代码,但这对我有帮助。

答案 1 :(得分:1)

使用LINQ尝试此操作。

首先使用以下代码将您的文本文件读取到List<string>

const string f = "TextFile1.txt";

// 1
// Declare new List.
List<string> lines = new List<string>();

// 2
// Use using StreamReader for disposing.
using (StreamReader r = new StreamReader(f))
{
    // 3
    // Use while != null pattern for loop
    string line;
    while ((line = r.ReadLine()) != null)
    {
    // 4
    // Insert logic here.
    // ...
    // "line" is a line in the file. Add it to our List.
    lines.Add(line);
    }
}

您需要定义一个您将拥有名称的类,以及相应的计数:

class PersonCount
{
    public string Name { get; set; }
    public int Count { get; set; }
}

最后使用此Lambda表达式获得所需的List<string>

List<PersonCount> personCounts = lines.GroupBy(p => p).Select(g => new PersonCount() {Name = g.Key, Count = g.Count()}).ToList();

现在遍历列表以获取名称和重复计数。

答案 2 :(得分:0)

使用HashMap可以解决您的问题。 当您读取名称时,请检查该密钥是否已存在,如果是,请更新它(+1),如果没有将其添加到您的哈希映射中。

最后,您需要做的就是打印键值对。

答案 3 :(得分:0)

将所有名称存储在Dictionary<string, int> names

对每一行使用类似的内容:

var theName = reader.ReadLine();
names[theName] += 1;

(如果项目不存在,则应将计数设置为1)

答案 4 :(得分:0)

当然,您也可以使用Linq:

执行此类操作(省略错误检查)
var names = new List<string>(
    File.ReadAllText(pathToFile).Split(
    Environment.NewLine.ToCharArray(),
    StringSplitOptions.RemoveEmptyEntries
));
var namesAndOccurrences =
    from name in names.Distinct()
    select name + " " + names.Count(n => n == name);

foreach (var name in namesAndOccurrences)
    Console.WriteLine(name);

根据文件的大小,可能需要删除流;但是,这并不是说如果文件对于内存来说相当大,那么你应该使用ReadLine

答案 5 :(得分:0)

foreach (var keyvalue in File.ReadAllLines(@"C:\....").GroupBy(x => x).Select(x => new { name = x.Key, count = x.Count() }))
{
        Console.WriteLine(keyvalue.name + ": " + keyvalue.count);
}

答案 6 :(得分:0)

试试这个离线解决方案

StreamReader dr = new StreamReader(@"C:\txt.txt");
string str = dr.ReadToEnd();
string[] p = str.Split(new string[] { Environment.NewLine, " " }, StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, int> count = new Dictionary<string, int>();
for (int i = 0; i < p.Length; i++)
{
    try
    {
        count[p[i].Trim()] = count[p[i]] + 1;
    }
    catch
    {
        count.Add(p[i], 1);
    }
}