【问题标题】:Avoid duplicates while creating CSV file创建 CSV 文件时避免重复
【发布时间】:2018-03-17 23:07:50
【问题描述】:

所以这是我需要修改的部分代码。我需要这样做,这样就不会有任何重复,而且在第二列的文件中应该创建一个数字,它被找到作为重复的次数。它应该是这样的: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);
            }
    }
}

【问题讨论】:

  • 您可以尝试使用linq group by 并计算每个组中的元素
  • 这看起来会是怎样的?我对 C# 相当陌生,所以我不是那么好

标签: c# duplicates export-to-csv


【解决方案1】:

现在真的...

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

“重复”将是您的计数器计数重复。从 0 开始。

【讨论】:

  • 但这会在 .csv 文件中的重复项旁边显示一个数字吗?
  • 而且文件仍然显示重复,所以没有任何改变。
  • @RenatasKarnauskas “但是 .csv 文件中的重复项旁边会显示一个数字吗?” - 不,它不会,它只显示重复的总数。抱歉,误解了您的需求
  • @RenatasKarnauskas “此外,该文件仍显示重复项,因此没有任何变化。” - List.Contains 依赖于 Equals 方法 (msdn.microsoft.com/en-us/library/… )
【解决方案2】:

在开始创建 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;
            }
        }
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我会改用HashSet&lt;Ring&gt;,因为它更有效。您需要覆盖Ring 中的EqualsGetHashCode 和/或实现IEquatable&lt;Ring&gt;

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

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

      【讨论】:

      • 还是不行。它看起来应该是删除重复项,但也在下一个列上显示它复制了多少次。这是一张应该是什么样子的图片:imgur.com/a/KpUbf
      【解决方案5】:

      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  
      

      希望对你有所帮助

      【讨论】:

      • 噢德奎! 鞠躬 :3
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      相关资源
      最近更新 更多