2016-10-13 71 views
0

需要找到從列表中不可多得的好書(罕見的書是一本書,是在一個列表中,而不是在其他人)這裏是我的列表文件:需要找到善本從文件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 

下一個:

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 

控制檯我需要得到獨特的書的名字,但我得到:

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 

我的功能代碼:

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

我做錯了什麼?

回答

1

你加入這兩個項目,所以你需要刪除兩個:

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

可我只是補充說,這不是一個理想的解決方案?我將使用一些LINQ邏輯來完成與列表聯合不同的選擇...並且將覆蓋Book平等方法來指出兩本書是否是同一本書。

事情是這樣的:

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

甚至這樣的:

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

在上述兩種需要實現課程的IEqualityComparer<Book>

+0

列表。移除方法(T) 從列表中刪除第一次出現的特定對象。 也可以使用RemoveAll。 – Pieter21

1

我喜歡LINQ的這種操作:

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

這需要所有書籍fak[0]對此有具有相同Pavfak[1]fak[1]沒有書籍,所有書籍,其中有沒有與相同的Pav

+0

@JanneMatikainen這將如何工作? –