我无法尝试仅提取不重复的行,只提取仅与测试文件重复的行。输入文件包含重复行和非重复行。
我已经创建了一个日志记录功能,我可以从中提取所有唯一的行到一个单独的文件,但是包含重复的行和不行的行,我需要将它们分开。
这是我到目前为止所拥有的;
static void Dupes(string path1, string path2)
{
string log = log.txt;
var sr = new StreamReader(File.OpenRead(path1));
var sw = new StreamWriter(File.OpenWrite(path2));
var lines = new HashSet<int>();
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
int hc = line.GetHashCode();
if (lines.Contains(hc))
continue;
lines.Add(hc);
sw.WriteLine(line);
}
sw.Close();
}
理想情况下,这将是两个函数,因此可以调用它们对输出内容执行不同的操作。
答案 0 :(得分:4)
使用LINQ to Group项目,然后检查计数:
var lines = File.ReadAllLines(path1);
var distincts = lines.GroupBy(l => l)
.Where(l => l.Count() == 1)
.Select(l => l.Key)
.ToList();
var dupes = lines.Except(distincts).ToList();
值得注意的是Except
不会返回重复项 - 我刚学到的东西。因此,之后无需致电Distinct
。
答案 1 :(得分:2)
您可以按照以下操作
var lines = File.ReadAllLines(path1);
var countLines = lines.Select(d => new
{
Line = d,
Count = lines.Count(f => f == d),
});
var UniqueLines = countLines.Where(d => d.Count == 1).Select(d => d.Line);
var NotUniqueLines = countLines.Where(d => d.Count > 1).Select(d => d.Line);