使用C#从列表中删除最旧的n个项目

时间:2013-06-05 04:41:16

标签: c#

我正在制作经常更新的动态分数列表。最终,这用于产生总体评级,因此需要删除较旧的条目(基于某些参数,而不是时间)以防止对整体进行重度+/-加权。它将从单独的枚举中一次添加多个值。

  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
  }

如果有人可以提供帮助,我将不胜感激:)我不得不使代码有点泛泛,因为它是相当密码编写的(没有编写方法)。

6 个答案:

答案 0 :(得分:38)

使用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项目结束时 - 所有最早的项目都在开头。

答案 1 :(得分:26)

试试这个

scoreList.RemoveAt(scoreList.Count-1);

here是MSDN文章

答案 2 :(得分:7)

我建议使用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();
  }

答案 3 :(得分:1)

我不太了解你的问题,希望这是你想要的。

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

答案 4 :(得分:0)

使用linq从列表中获取最后n个元素的简单方法

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

答案 5 :(得分:0)

我玩弄了一下并查看了上面建议的方法(scoresList.RemoveAt()),但它并不适合这种情况。最终起作用的是什么:

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

感谢帮助人员