Удалить последние 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
}
Если кто-то может помочь, это было бы очень благодарно:) Мне пришлось сделать код немного общим, потому что он написан довольно загадочно (не писал методы).
Ответы
Ответ 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);
}
Спасибо за помощь ребятам