C# 计算文本文件c中的单个行数#

C# 计算文本文件c中的单个行数#,c#,C#,我有一个14000行的文本文件,但其中许多是重复的。我想计算唯一的行数,但是我只能访问framework 3.0及以下版本。不使用.linq是否可以执行此操作?当然可以,您可以使用StreamReader.ReadLine循环每一行,并将每一行添加到哈希表结构中,使用该行作为键,使用一些虚拟对象作为值。但是,在添加字符串之前,应该检查哈希表是否还没有键: HashTable uniqueLines = new System.Collections.HashTable(); string line

我有一个14000行的文本文件,但其中许多是重复的。我想计算唯一的行数,但是我只能访问framework 3.0及以下版本。不使用.linq是否可以执行此操作?

当然可以,您可以使用
StreamReader.ReadLine
循环每一行,并将每一行添加到哈希表结构中,使用该行作为键,使用一些虚拟对象作为值。但是,在添加字符串之前,应该检查哈希表是否还没有键:

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);
  }
}
最后,哈希表中的项目数应等于文件中的唯一行数:

int count = uniqueLines.Count;
// And don't forget to close the reader (and writer)!
为什么这样做有效?因为哈希表使用GetHashCode(0)返回的哈希代码,根据MSDN:

如果两个字符串对象相等,则GetHashCode方法返回 相同的值。但是,没有唯一的哈希代码值 每个字符串值都是唯一的。不同的字符串可以返回相同的哈希值 代码


现在我不确定当两个不同的字符串具有相同的哈希代码时,这种情况有多普遍,但据我所知,许多LINQ方法在内部使用哈希表,因此这可能是最接近LINQ的做法。

我认为您也可以用LINQ编写它

     var result = from p in File.ReadAllLines(filepath)
         group p by p into g
         select new { Key = g.Key, Count = g.Count() };

它是可理解的。

文件是否已“排序”(即副本是一个接一个的,还是在文件中的任何位置)?Framework 3确实支持LINQ,对吗?你检查过了吗?你能具体说明一下Fx和C版本吗?不,它们到处都是,这不是我们需要的答案。你是否使用低于2.0的版本?你可以在更新的项目上使用ilSpy,并了解它们在LINQ中的工作方式:)如何将其指向文件?找不到类型或命名空间名称“HashTable”(是否缺少using指令或程序集引用?)(CS0246)-C:\Users\Stefan\Dropbox\C\Assigment\Assigment\Program.cs:50,3@Evildommer5您是否在.Cs文件中添加了这些名称空间是的,但是您需要导入
System.Collections
名称空间。