提取唯一和非唯一字符串以分隔输出文件

时间:2014-12-23 16:04:20

标签: c# string unique

我无法尝试仅提取不重复的行,只提取仅与测试文件重复的行。输入文件包含重复行和非重复行。

我已经创建了一个日志记录功能,我可以从中提取所有唯一的行到一个单独的文件,但是包含重复的行和不行的行,我需要将它们分开。

这是我到目前为止所拥有的;

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();
}

理想情况下,这将是两个函数,因此可以调用它们对输出内容执行不同的操作。

2 个答案:

答案 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);