2017-10-06 125 views
1

所以这是我需要修改的代码的一部分。我需要使它不会有任何重复,但是在第二列的文件中也应该创建一个数字,它被发现有多少次是重复的。它应该是这样的:https://imgur.com/a/KpUbf创建CSV文件时避免重复

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

您可以尝试使用LINQ组和计算每个组 – daniell89

+0

中的元素如何将看起来像exacly?我相当新的C#,所以我不是那么好 –

回答

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 

希望它能够对您有帮助

+0

Oho dekui! *下降*:3 –

1

现在真的...

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

其中 '重复' 将你的计数器的计数重复。从0开始。

+0

但是,将显示一个数字旁边的重复.csv文件? –

+0

此文件仍然显示重复,所以没有任何改变。 –

+0

@RenatasKarnauskas“但是,将在.csv文件中显示重复旁边的数字吗?” - 不,它不会,它只显示重复的总数。对不起,误解您的需求 – tevemadar

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

首先你要环来实现equals()和有一个体面的GetHashCode()。然后使用值为count的字典。这不是幻想,但它很清楚。

2

我会用HashSet<Ring>来代替它,因为它效率更高。您需要覆盖EqualsGetHashCode中的Ring和/或执行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); 
} 
+0

它仍然不起作用。它应该看起来像删除重复项,而且在下一个collumn节目中显示它重复了多少次。这张照片应该是这样的:https://imgur.com/a/KpUbf –