Подтвердить что ты не робот

Удалить последние n элементов из списка с помощью С#

Я работаю над динамическим списком баллов, который часто обновляется. В конечном итоге это используется для получения общей оценки, поэтому для предотвращения тяжелого +/- взвешивания в целом необходимо удалить старые записи (основанные на некоторых параметрах, а не время). Он будет добавлять сразу несколько значений из отдельного перечисления.

  List<int> scoreList = new List<int>();

  foreach(Item x in Items)
  { 
     scoreList.Add(x.score);
  }

  //what I need help with:
  if(scoreList.Count() > (Items.Count() * 3))
  {
      //I need to remove the last set (first in, first out) of values size 
      //Items.Count() from the list
  }

Если кто-то может помочь, это было бы очень благодарно:) Мне пришлось сделать код немного общим, потому что он написан довольно загадочно (не писал методы).

4b9b3361

Ответ 1

Используйте List<T>.RemoveRange - что-то вроде этого:

// number to remove is the difference between the current length
// and the maximum length you want to allow.
var count = scoreList.Count - (Items.Count() * 3);
if (count > 0) {
    // remove that number of items from the start of the list
    scoreList.RemoveRange(0, count);
}

Вы удаляете из начала списка, потому что, когда вы Add элементы, они идут до конца - поэтому самые старые находятся в начале.

Ответ 2

Попробуйте это

scoreList.RemoveAt(scoreList.Count-1);

И здесь является статьей MSDN

Ответ 3

Вместо использования List<int> я бы рекомендовал использовать Queue<int>. Это даст вам поведение FIFO, которое вы ищете.

Подробнее о очередях см. http://msdn.microsoft.com/en-us/library/7977ey2c.aspx.

  Queue<int> scoreList = new Queue<int>();

  foreach(Item x in Items)
  { 
     scoreList.Enqueue(x.score);
  }

  //Or you can eliminate the foreach by doing the following
  //Queue<int> scoreList = new Queue<int>(Items.Select(i => i.score).ToList());

  //Note that Count is a property for a Queue
  while (scoreList.Count > (Items.Count() * 3))
  {
     scoreList.Dequeue();
  }

Ответ 4

Я не очень хорошо понял ваш вопрос, надеюсь, если это то, что вы хотите.

scoreList.RemoveRange(Items.Count()*3, scoreList.Count()-Items.Count()*3);

Ответ 5

Простой способ получить последние n элементов из списка с linq

      scoreList.Skip(Math.Max(0, scoreList.Count() - N)).Take(N)

Ответ 6

Я поиграл и посмотрел на предложенный выше метод (scoresList.RemoveAt()), но он не был подходящим для ситуации. Что закончилось:

 if (...)
 {
    scoresList.RemoveRange(0, scores.Count);
 }

Спасибо за помощь ребятам