37

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

  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
  }

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

4

6 回答 6

50

使用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项目移至末尾时 - 所以最旧的位于开头。

于 2013-06-05T04:48:37.803 回答
25

尝试这个

scoreList.RemoveAt(scoreList.Count-1);

这是 MSDN文章

于 2013-06-05T04:48:24.253 回答
7

而不是使用 aList<int>我会建议使用 a 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();
  }
于 2013-06-05T05:04:32.597 回答
1

我不太明白你的问题,希望这是你想要的。

scoreList.RemoveRange(Items.Count()*3, scoreList.Count()-Items.Count()*3);
于 2013-06-05T04:49:48.993 回答
0

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

      scoreList.Skip(Math.Max(0, scoreList.Count() - N)).Take(N)
于 2013-06-05T04:50:33.770 回答
0

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

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

谢谢你们的帮助

于 2013-06-05T04:52:32.787 回答