我现在正在使用streamreader来读取人名的文件,它是一个人名的文本文件,所以显然有重复,我希望能够显示现在有多少人拥有相同的名字例如:
josh
alex
josh
john
alex
我希望它说,
josh 2
alex 2
john 1
但我似乎无法找到一种简单的方法,这样做最简单的方法,
答案 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);
}
}