2016-12-12 8 views
1

Я борюсь с arraylists в списке. У вас есть несколько вопросов.Как найти элемент строки в одном из нескольких архиваристов внутри списка? C#

Прежде всего: мои испытания с удалением логарифма работают, но я вызываю исключение, не знаю, что делать (см. Случай 4).

Во-вторых: я могу отредактировать любой из существующих журналов (еще не в меню), больше похоже на изменение одной из строк в существующем журнале, например «пост» или «название». мне намек ??

{ 
    List<string[]> logBook = new List<string[]> { }; // Skapar en lista för arrayer av typen string. 
    DateTime time = DateTime.Now; // Sätter variabeln time till lokal tid på datorn. 

    int logCount = 0; // Deklarerar en variabel för att räkna inläggen, 
         // läggs utanför case 1 så att den är nollad vid uppstart av programmet 
         // och när den kommer in i case 1 så räknar den upp. 

    Console.WriteLine("\t" + time.ToLongDateString()); // Skriver ut datum i ett passande format för en loggbok. 
    Console.WriteLine("\n\tWelcome to the Logbook!\n"); // Skriver ut välkomsttext en gång vid uppstart, 
                 // därför läggs den utanför while-loopen. 

    bool go = true; // Booleanskt värde för while-loopen som ska ligga för menyn och som br 

    while (go) 
     try   // Exception-block som fångar upp om användaren knappar in ex. bokstäver som val i menyn (förhindrar körfel). 
     { 
      { 
       Console.WriteLine(""); //Skapar ny rad. Användaren ska inte känna att det blandar ihop sig. 
       Console.WriteLine("\t[1] Write a new post"); 
       Console.WriteLine("\t[2] Search for a post"); 
       Console.WriteLine("\t[3] Display all posts"); 
       Console.WriteLine("\t[4] Remove a post"); 
       Console.WriteLine("\t[5] Quit"); 

       Console.Write("\n\tSelect from menu: "); 

       int menu = Convert.ToInt32(Console.ReadLine()); //Gör om inmatad sträng till heltal. 
       Console.WriteLine(""); //Skapar mellanrum innan nästa direktiv till användaren (Estetiskt). 

       switch (menu) 
       { 
        case 1: 

         logCount++; 
         string logNr = "Log number: " + logCount.ToString(); // Skapar en nurering av loggarna. 

         string timeDate = time.ToLongDateString(); // Ger oss ett datum för inlägget. 

         Console.Write("\tWrite a title to your post: "); 
         string title = "Title: " + Console.ReadLine(); // Ger oss en titel för inlägget. 

         Console.Write("\n\tPost is created " + timeDate + "\n\n\tWrite your post: "); 

         string post = Console.ReadLine(); 

         string[] arr = new string[4]; 
         arr[0] = logNr; 
         arr[1] = timeDate; 
         arr[2] = title; 
         arr[3] = post; 

         logBook.Add(arr); 
         break; 

        case 2: 
         Console.Write("\tWrite a searchword or a date (yyyy-mm-dd): "); 
         string keyword = Console.ReadLine(); 
         Console.WriteLine(""); 

         bool anyFound = false; 

         foreach (string[] item in logBook) //För varje element(item) i Listan(logBook) dvs (arr[i]) 
         { 
          foreach (string element in item) //För varje element(element) i arr[i] dvs (arr[0], arr[1], arr[2]) 
          { 
           if (element.Contains(keyword)) // Om arr[0], arr[1] eller arr[2] innhåller sökord...., 
                   // letar efter en substring(keyword) inom strängen. 
           { 
            foreach (string s in item) // Skriv ut varje arr[i] i det elementet(item) (dvs hela den loggen) 
                   // I detta fall tre varv, datum, titel, text(post) = 3 strängar. 
                   // För att användaren ska kunna se hela loggen som sökordet finns i. 
            { 
             Console.WriteLine("\t" + s); 
            } 
            Console.WriteLine(""); 
            anyFound = true; // Kliver ur loopen då uppdraget är slutfört, bool ändrar värde till true. 
           } 
          } 
         } 
         if (!anyFound) // Om inget hittas dvs bool är fortfarande oförändrat genomförs utskrift. 
          Console.WriteLine("\tSearchword couldn't be found."); 
         break; 

        case 3: 
         Console.WriteLine("\tThese are the current posts in Logbook.\n "); 

         foreach (var item in logBook) //För varje element(item) i Listan(logBook) dvs (arr[i]) 
         { 
          foreach (string element in item) //För varje element(element) i arr[i] dvs (arr[0], arr[1], arr[2]) 
          { 
           Console.WriteLine("\t" + element); 
          } 
           Console.WriteLine(""); 
         } 
         break; 

        case 4: 

         Console.Write("\tWhich log number do you want to remove? : "); 
         string erase = "Log number: " + Console.ReadLine(); 

         foreach (string[] item in logBook) // För varje element(item) i Listan(logBook) dvs (arr[i]) 
         { 
          if (item.Contains(erase)) // Om arr[0], arr[1] eller arr[2] innhåller sökord...., 
          { 
           logBook.Remove(item); // raderas hela elementet(item/arr[i]) 
           Console.WriteLine("\t" + erase + " is now removed from logbook."); 
          } 
         } 


         break; 

        case 5: 
         go = false; // Avbryter while-loopen och med det avslutar programmet. 
         break; 

        default:  // Fångar upp om användaren skriver in ett tal utanför valmenyn. 
         Console.WriteLine("\tChoose from menu 1 - 4"); 
         break; 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine(""); //Estetisk för att användaren ska få ny rad innan meddelandet. 
      Console.WriteLine("\tChoose from menu by using number 1 - 4\n" + e); //Aktiveras om användaren knappar in annat än heltal. 
     } 
    } 
+0

какое исключение должно произойти в случае 4? – XtremeBaumer

ответ

0

@ScottPerham правильно, что вы не можете изменить коллекцию в то время как итерация его. Поскольку вы, по-видимому, хотите стереть только один элемент, вы также можете исправить это, просто нажав break после того, как вы удалили элемент.

Эта линия имеет проблему:

if (item.Contains(erase)) 

item представляет собой массив строк; вызываемый метод Contains - это метод в коллекции, который проверяет, соответствуют ли любые элементы в коллекции (точно) предоставленному вводу. Это отличается от string.Contains, который ищет подстроки. Вы хотите вместо этого:

if (item[0].Contains(erase)) 

EDIT

Учитывая, что ваша строка поиска должна быть точным соответствием, вы должны найти этот пост - но вы также можете найти какую-либо должность, где тело поста это, скажем, «Номер журнала: 2» (это может быть другое сообщение). Вы действительно хотите проверить только ítem[0].


Чтобы ответить на ваш второй вопрос: вы уже знаете, как найти сообщение; вы сделали это для случая «удалить». После того, как вы нашли тот, который вы хотите изменить, просто обновить содержание, подобное тому, что вы делаете при создании новой записи:

Console.Write("\tWhich log number do you want to change? : "); 
string change = "Log number: " + Console.ReadLine(); 

foreach (string[] item in logBook) // För varje element(item) i Listan(logBook) dvs (arr[i]) 
{ 
    if (item[0].Contains(change)) // Om arr[0], arr[1] eller arr[2] innhåller sökord...., 
    { 
     string timeDate2 = time.ToLongDateString(); // Ger oss ett datum för inlägget. 

     Console.Write("\tWrite a title to your post: "); 
     string title2 = "Title: " + Console.ReadLine(); // Ger oss en titel för inlägget. 

     Console.Write("\n\tPost is created " + timeDate2 + "\n\n\tWrite your post: "); 

     string post2 = Console.ReadLine(); 

     item[1] = timeDate2; 
     item[2] = title2; 
     item[3] = post2; 
    } 
} 

Пожалуйста, обратите внимание, что есть место для улучшения в структуре этого кода ,

+0

Thx Petter, я попробую это и поработаю с ним, как только я получу свою чашку кофе, я был с ней с раннего утра. знаю результат. – Tarbh

+0

Я пробовал это, и он отлично работает. Я медленно это изучаю, всего лишь 9 недель;) Thx для помощи. – Tarbh

+0

Lykke til videre. –

1

вы не можете изменить список, пока вы итерация над ним в Еогеасп от MSDN:.

оператор Еогеасп используется для итерации по коллекции, чтобы получить информацию что вы хотите, , но не могут быть использованы для добавления или удаления предметов из исходной коллекции, чтобы избежать непредсказуемых побочных эффектов. Если вам нужно добавить или удалить элементы из исходной коллекции, используйте цикл for.

Вы можете использовать использование цикла for, а не foreach? Что-то вдоль линий:

for (var i = 0; i < logbook.Count; i++) 
{ 
    if (logbook[i].Contains(erase)) 
    { 
     logBook.RemoveAt(i); 
     i--; 
     Console.WriteLine("\t" + erase + " is now removed from logbook."); 
    } 
} 
+0

Thx для помощи, но почему i - -; ?? – Tarbh

+0

i - это компенсация удаления элемента. –

+0

Aah, хорошо ..... это действительно объясняет мои предыдущие исключения, thx – Tarbh

0

Try использовать RemoveAll вместо:

logBook.RemoveAll(log => log.Any(row => row.Contains(erase))); 

List.RemoveAll Method @ MSDN

+0

Если (скажем) сообщение # 5 имеет тело сообщения со значением «Номер журнала: 2», оно будет удалено вместе с фактическим №2. 'x [0] .Contains (erase)' будет лучше. –

+0

Я не могу найти это требование из вопроса. Кроме того, если x пуст, код будет терпеть неудачу. – Chrille

0

Как уже отмечалось, вы не можете изменить коллекцию ЖУРН в то время как вы итерацию над ней с для каждого. Вы можете использовать цикл for для работы в обратном направлении по списку и использовать RemoveAt, когда найдете сообщение, которое ищете.

Увидев, что может быть не более одного сообщения с заданным номером журнала, вы также должны включить разрыв в цикле для выхода после того, как сообщение было найдено и удалено. Что-то вроде этого:

for (var i = logBook.Count - 1; i >= 0; i--) 
{ 
    if (logBook[i][0] == erase) 
    { 
     logBook.RemoveAt(i); 
     Console.WriteLine("\t" + erase + " is now removed from logbook."); 
     break; 
    } 
} 
+0

Несколько вопросов: Pls понимает, что я новичок в кодировании, но что именно означает «logBook [i] [0]» («Что именно это значит». Я убежден, что у меня есть список, который содержит элементы Array [] (строка типа), которая в свою очередь содержит 4 элемента строки (logNR, timeDate, post и title). Все это подобно дереву (я пытаюсь получить его логику). Почему for-loop назад? Thx для помощи – Tarbh

 Смежные вопросы

  • Нет связанных вопросов^_^