2015-05-13 2 views
-3

Все работает отлично, за исключением случая 2. В случае, если я пытаюсь удалить последние элементы из причины очереди по умолчанию, он удаляется с начала. Я попытался создать список реверсов, а затем удалил Reverse обратно в нормальное состояние, но, похоже, он не работает. Вот весь код:Удалить последние элементы из списка очередей

namespace _4 
    { 
    class Program 
     { 
     static void Main(string[] args) 
     { 
     Queue<string> que = new Queue<string>(); 
     int menu; 

    do 
     { 
      Console.WriteLine("1 - Add element"); 
      Console.WriteLine("2 - Remove last element"); 
      Console.WriteLine("3 - Find element"); 
      Console.WriteLine("4 - Info"); 
      Console.WriteLine("5 - Clear"); 
      Console.WriteLine("0 - Exit"); 

      Console.Write("Menu: "); 
      menu = Convert.ToInt32(Console.ReadLine()); 

      switch (menu) 
      { 
       case 1: 
       { 
        Console.Write("How much elements?"); 

        int cik = Convert.ToInt32(Console.ReadLine()); 

        for (int i = 0; i < cik; i++) 
        { 
         Console.Write("How much elements?: "); 
         string cipars = Console.ReadLine(); 

         que.Enqueue(cipars); 
        } 

        Console.WriteLine(); 
       } 
       break; 

       case 2: // nestrada 
       { 
        Console.Write("How much elements starting from last?"); 
        int skaits = Convert.ToInt32(Console.ReadLine()); 

        que.Reverse(); 

        for (int i = 0; i < skaits; i++) 
        { 
         que.Dequeue(); 
        } 

        que.Reverse(); 


        Console.WriteLine(); 
       } 
       break; 
       case 3: 
       { 
        Console.Write("Ievadiet elementu: "); 
        string elements = Console.ReadLine(); 

        int numurs = 0; 

        if (que.Contains(elements)) 
        { 
         foreach (string item in que) 
         { 
          if (item==elements) 
          { 
           Console.WriteLine("Elementa index ir {0}",numurs); 
          } 
          numurs++; 
         } 
        Console.WriteLine(); 
        } 

        else 
        { 
         Console.WriteLine("shada elementa nav."); 
        } 
       } 
       break; 
       case 4: 
       { 
        Console.WriteLine("Elementu skaits: {0}",que.Count); 
        Console.WriteLine(); 
        foreach (var item in que) 
        { 
         Console.WriteLine(item); 
        } 
       } 
       break; 
       case 5: 
       { 
        que.Clear(); 
       } 
       break; 
      } 
     } while (menu != 0); 


    } 
} 

}

+0

«кажется, не работает» ... точно, как он не работает? – hatchet

+0

он не обращается вообще. Он просто удаляет первый элемент из списка. Почему я продолжаю получать минусы по теме? Что я делаю не так? – naathanz

+0

Ваш метод 'Reverse' изменяет список или возвращает новый список с удаленным элементом beggining? – Sidewinder94

ответ

0

Reverse функция. Вы должны назначить новую очередь переменной и использовать новую переменную.

var reveredQueue = que.Reverse();

Я бы не использовал очередь, если вы хотите удалить записи с обеих сторон. Попробуйте использовать массив.

1

Reverse() - метод LINQ, а не метод, предоставляемый классом Queue. Он использует Queue в качестве входной последовательности IEnumerable и возвращает новыйIEnumerable с отмененным порядком элементов.

Таким образом, звонок que.Reverse() будет делать точно ничего в вашем коде (даже не отходы циклов процессора).

Вы не можете удалить последний элемент из очереди. единственное, что вы можете сделать, это создать новую очередь, из которой последний элемент опущен.

que = new Queue<string>(que.Take(queue.Count - 1)); 

Это очень неэффективно, и вы можете подумать дважды, если не может быть лучший способ добиться того, что вы хотите.

2

Вы считаете, что очередь с двойным завершением? Реализация может быть this

Однако то, что вы можете сделать ниже, чтобы на месте получить первый элемент

object RemoveLast(Queue q) { 
object first = q.Peek(); 
object current = null; 
while (true) { 
    current = q.Dequeue(); 
    if (q.Peek() == first) { 
     break; 
    } 
    q.Enqueue(current); 
} 
return current; 
} 

функции НАЙДЕНО here

0

Я просто ответил на это здесь с четырьмя методами расширения на Класс очереди: https://stackoverflow.com/a/34862509/2634050 Опять же, возможно, вы не должны использовать очередь в первую очередь, но для моего варианта использования мне пришлось оставить существующий код неповрежденным.