创建 CSV 文件时避免重复

Avoid duplicates while creating CSV file

所以这是我需要修改的部分代码。我需要这样做,这样就不会有任何重复项,而且在第二列的文件中应该创建一个数字,它被认为是重复项的次数。它应该是这样的:https://imgur.com/a/KpUbf

private static void SaveDataToFile(List<Ring> rings)
{
    using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
    {
        List<Ring> results = new List<Ring>();
        writer.WriteLine("Metalai");

        foreach (var ring in rings)
            if (!results.Contains(ring))
            {
                writer.WriteLine("{0}", ring.Metalas);
            }
    }
}

现在真的...

if(!results.Contains(ring)){
    results.Add(ring);
    writer....
} else {
    duplicates++;
}

其中 'duplicates' 是您计算重复项的计数器。从0开始。

在开始创建 csv 文件之前考虑对环进行排序以降低计算量。在排序的情况下,您知道重复项会彼此相邻出现,因此,在编写 rings(15) 时,您只需验证 rings(14) 没有重复项。否则你将需要遍历整个环变量 ech 并且每次都会增加工作量。

所以对于排序的情况,这可能是一个解决方案:

private static void SaveDataToFile(List<Ring> rings)
{
    using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
    {
        List<Ring> results = new List<Ring>();
        writer.WriteLine("Metalai");
        String oldRing = String.empty;
        int duplicates = 0;
        foreach (var ring in rings)
            if (!results.Contains(ring))
        {
            if (ring.Metalas == oldRing)
            {
                Console.WriteLine("{0}", ring.Metalas);
                duplicates++;
            }
            else
            {
                writer.WriteLine("{0}", ring.Metalas);
                oldRing = ring.Metalas;
            }
        }
    }
}

首先,您需要 Ring 实现 Equals() 并有一个像样的 GetHashCode()。然后使用值为计数的字典。不花哨,但很清晰。

我会改用 HashSet<Ring>,因为它效率更高。您需要在 Ring and/or 中覆盖 EqualsGetHashCode 实现 IEquatable<Ring>

不过,您也可以使用这种简单的方法:

private static void SaveDataToFile(List<Ring> rings)
{
    var metalasLookup = rings.ToLookup(r => r.Metalas);
    using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
    {
        writer.WriteLine("Metalai");
        foreach (var metalasGroups in metalasLookup)
        {
            int count = metalasGroups.Count();
            string = line $"{metalasGroups.Key},{(count == 0 ? "" : count.ToString())}";
            writer.WriteLine(line);
        }
    }
}

或者非常简洁的版本:

static void SaveDataToFile(List<Ring> rings)
{
    var lines = rings.ToLookup(r => r.Metalas).Select(x => $"{x.Key},{(x.Any() ? x.Count().ToString() : "")}");
    File.WriteAllLines(@"Metalai.csv", lines);
}

Labas draugas,我想你正在寻找这样的东西,

static void Main(string[] args)
{
    List<Ring> rings = new List<Ring>();
    rings.Add(new Ring { Id = 1, Name = "siauliai", Metalas = "s" });
    rings.Add(new Ring { Id = 2, Name = "kaunas", Metalas = "k" });
    rings.Add(new Ring { Id = 3, Name = "vilnius", Metalas = "v" });
    rings.Add(new Ring { Id = 4, Name = "klapedia", Metalas = "ka" });
    rings.Add(new Ring { Id = 5, Name = "siauliai", Metalas = "s" });

    SaveDataToFile(rings);

    Console.ReadKey();
}

private static void SaveDataToFile(List<Ring> rings)
{
    using (StreamWriter writer = new StreamWriter(@"Metalai.csv"))
    {
        List<string> ringMetalas = new List<string>();
        writer.WriteLine("Metalai;Duplication");

        foreach (var ring in rings)
        {
            if (!ringMetalas.Contains(ring.Metalas))
            {
                var duplicationCount = rings.Count(r => r.Metalas == ring.Metalas);
                ringMetalas.Add(ring.Metalas);

                var mesage = $"{ring.Metalas}";
                if (duplicationCount > 1)
                    mesage += $";{duplicationCount}";

                writer.WriteLine("{0}", mesage);
            }
        }
    }
}

结果喜欢;

Metalai Duplication
s       2
k   
v   
ka  

希望对你有所帮助