2017-10-06 4 views
1

Il s'agit donc de la partie du code que j'ai besoin de modifier. Je dois faire en sorte qu'il n'y aurait pas de doublons mais aussi dans le fichier sur la deuxième colonne devrait créer un nombre combien de fois il a été trouvé en tant que doublon. Il devrait ressembler à ceci: https://imgur.com/a/KpUbfÉvitez les doublons lors de la création d'un fichier 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

Vous pouvez essayer d'utiliser un groupe LINQ par et compter les éléments dans chaque groupe – daniell89

+0

Comment cela ressemblerait exacly? Im assez nouveau à C# donc je ne suis pas si bon –

Répondre

2

draugas Labas, je pense que vous cherchez quelque chose comme ça,

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

Résultat J'aime;

Metalai Duplication 
s  2 
k 
v 
ka 

Espoir son aide pour vous

+0

Oho dekui! * S'incline *: 3 –

1

vraiment ...

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

où doublon serait votre compteur de comptage des doublons. Commencez par 0.

+0

Mais cela montrera un nombre à côté de la copie dans le fichier .csv? –

+0

Le fichier montre toujours des doublons, donc rien n'a changé. –

+0

@RenatasKarnauskas "Mais cela affichera-t-il un nombre à côté de la copie dans le fichier .csv?" - Non, ça ne va pas, ça montre juste le nombre total de doublons. Désolé, mal compris votre besoin – tevemadar

0

Envisagez de trier les anneaux avant de commencer à créer votre fichier csv pour réduire l'effort de calcul. Dans le cas trié, vous savez que les doublons apparaîtraient les uns à côté des autres, ainsi, lorsque vous écrivez des anneaux (15), vous n'avez qu'à vérifier que les anneaux (14) ne sont pas des doublons. Sinon, vous auriez besoin de passer par la variable anneaux entiers ech et chaque fois ce qui augmente l'effort.

Donc, pour le cas trié cela pourrait être une solution:

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

D'abord, vous aurez envie Anneau d'implémenter equals() et ont une bonne GetHashCode(). Ensuite, utilisez un dictionnaire où la valeur est comptée. Ce n'est pas sophistiqué, mais c'est clair.

2

J'utiliserais plutôt un HashSet<Ring> parce que c'est beaucoup plus efficace. Vous devez remplacer Equals et GetHashCode par Ring et/ou implémenter IEquatable<Ring>.

Cependant, vous pouvez également utiliser cette approche simple:

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

ou avec une version très concise:

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

ne fonctionne pas. Ce à quoi il devrait ressembler est de supprimer les doublons, mais aussi sur le prochain spectacle de la série combien de fois il a été dupliqué. Voici une image à quoi cela devrait ressembler: https://imgur.com/a/KpUbf –