我有一个14000行的文本文件,但其中许多都是重复的。我想计算独特的行,但我只能访问框架3.0及以下。是否可以在不使用.linq的情况下执行此操作?
答案 0 :(得分:3)
当然有可能,您可以使用StreamReader.ReadLine
循环遍历每一行,并使用行作为键并将一些虚拟对象作为值将每行添加到HashTable结构。在添加字符串之前,您应该检查HashTable是否还没有密钥:
HashTable uniqueLines = new System.Collections.HashTable();
string line;
// Read each line of the file until the end
while ((line = reader.ReadLine()) != null)
{
// Check that we have not yet seen this string before
if(uniqueLines.ContainsKey(line) == false)
{
uniqueLines.Add(line, 0);
// You can write the lines to another file in necessary
writer.WriteLine(line);
}
}
最后,HashTable中的项目数应该等于文件中唯一行的数量:
int count = uniqueLines.Count;
// And don't forget to close the reader (and writer)!
为什么这样做?因为HashTable使用GetHashCode返回的哈希码(0并且根据MSDN:
如果两个字符串对象相等,则返回GetHashCode方法 相同的价值观但是,没有唯一的哈希码值 每个唯一的字符串值。不同的字符串可以返回相同的散列 代码。
现在我不确定当两个不同的字符串具有相同的哈希码时有多常见,但据我所知,许多LINQ方法在内部使用HashTable,因此这可能是最接近LINQ的功能。
答案 1 :(得分:0)
我想你也可以用linq写的。
var result = from p in File.ReadAllLines(filepath)
group p by p into g
select new { Key = g.Key, Count = g.Count() };
这是可以理解的。