2016-10-13 6 views
0

Nötige zu finden, ein seltenen Bücher aus der Liste (seltenes Buch ist ein Buch, das in einer Liste enthalten ist und in anderen nicht) finden hier meine Liste Datei ist:Need to Rare Books aus Datei C#

1;Book1;name1;genre1;publisher1;2015;1000 
2;Book2;name2;genre2;publisher2;2015;1000 
3;Book3;name3;genre3;publisher3;2015;1000 
4;Book4;name4;genre4;publisher4;2015;1000 

nächste :

1;Book1;name1;genre1;publisher1;2015;1000 
2;Book2;name2;genre2;publisher2;2015;1000 
3;Book3;name3;genre3;publisher3;2015;1000 
4;Book4;name4;genre4;publisher4;2015;1000 
5;Unique;name5;genre5;publisher5;2015;1250 

in Konsole ich brauche den einzigartigen Buchnamen zu bekommen, aber ich bekomme:

1, name1, Book1 , genre1 , publisher1 , 2015 , 1000 
2, name2, Book2 , genre2 , publisher2 , 2015 , 1000 
3, name3, Book3 , genre3 , publisher3 , 2015 , 1000 
4, name4, Book4 , genre4 , publisher4 , 2015 , 1000 
5, name5, Unique , genre5 , publisher5 , 2015 , 1250 

meinen Funktionscode:

public static void RareBook(Padaliniai[] fak) 
{ 
    List<Book> RareBooks = new List<Book>(); 
    for (int i = 0; i < 2; i++) 
    { 
     foreach (Book bok in fak[i].GetBookList()) 
     { 
      RareBooks.Add(bok); 
     } 
    } 

    for (int i = 0; i < 2; i++) 
    { 
     foreach (Book a in fak[0].GetBookList()) 
     { 
      foreach (Book b in fak[1].GetBookList()) 
      { 
       if (a.Pav == b.Pav) 
       { 
        RareBooks.Remove(b); 
       } 
      } 
     } 
    } 

    foreach (Book bok in RareBooks) 
    { 
     Console.WriteLine("{0}, {1}, {2} , {3} , {4} , {5} , {6}",bok.ISBN,bok.Autorius,bok.Pav,bok.Zanras,bok.Leidykla,bok.Metai,bok.Psl); 
    } 
} 

was mache ich falsch?

Antwort

1

Sie fügen beide Einträge, so müssen Sie beide entfernen:

foreach (Book b in fak[1].GetBookList()) 
{ 
    if (a.Pav == b.Pav) 
    { 
    RareBooks.Remove(a); 
    RareBooks.Remove(b); 
    } 
} 

Kann ich nur hinzufügen, dass dies keine ideale Lösung ist? Ich würde eine LINQ-Logik verwenden, um eine Auswahl zu treffen, die sich von der Vereinigung der Listen unterscheidet ... und würde die Book Gleichheitsmethoden überschreiben, um anzugeben, wenn zwei Bücher dasselbe Buch sind.

Etwas wie folgt aus:

List<Book> rareBooks = fak[0].GetBookList().Except(fak[1].GetBookList()) 
         .Union(fak[1].GetBookList().Except(fak[0].GetBookList())) 
         .ToList(); 

Oder auch dies:

rarebooks = fak[0].GetBookList().Union(fak[1].GetBookList()).Distinct(); 

In beiden oben benötigen Sie einen IEqualityComparer<Book> natürlich zu implementieren.

+0

Liste .Remove-Methode (T) Entfernt das erste Vorkommen eines bestimmten Objekts aus der Liste . Konnte RemoveAll stattdessen auch verwenden. – Pieter21

1

Ich würde LINQ bevorzugen für diese Art von Operation:

List<Book> fak0Books = fak[0].GetBookList(); 
List<Book> fak1Books = fak[1].GetBookList(); 
List<Book> rareBooks = fak0Books.Where(b0 => fak1Books.All(b1 => b0.Pav != b1.Pav)). 
           Concat(fak1Books.Where(b1 => fak0Books.All(b0 => b0.Pav != b1.Pav)). 
           ToList(); 

Diese alle Bücher von fak[0] nimmt, für die es keine Bücher mit dem gleichen Pav in fak[1] sind und alle Bücher von fak[1] für die es keine sind Bücher mit dem gleichen Pav in fak[0].

+0

@JanneMatikainen wie würde das funktionieren? –