创建CSV文件时避免重复

时间:2017-10-06 07:41:28

标签: c# duplicates export-to-csv

所以这是我需要修改的代码部分。我需要做到这一点,以便不会有任何重复,但在第二列的文件中应该创建一个数字,它被发现重复多少次。它应该如下所示: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);
            }
    }
}

5 个答案:

答案 0 :(得分:2)

我会使用HashSet<Ring>代替,因为它效率更高。您需要覆盖Equals中的GetHashCodeRing和/或实施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);
}

答案 1 :(得分:2)

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  

希望对你有所帮助

答案 2 :(得分:1)

现在真的......

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

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

答案 3 :(得分:1)

首先,你需要Ring实现Equals()并拥有一个不错的GetHashCode()。然后使用值为count的Dictionary。这不是花哨,但很清楚。

答案 4 :(得分:0)

在开始创建csv文件之前,请考虑对环进行排序,以降低计算工作量。在排序的情况下,您知道重复项会彼此相邻显示,因此,在编写环(15)时,您只需要验证环(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;
            }
        }
    }
}