我正在制作经常更新的动态分数列表。最终,这用于产生总体评级,因此需要删除较旧的条目(基于某些参数,而不是时间)以防止对整体进行重度+/-加权。它将从单独的枚举中一次添加多个值。
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
}
如果有人可以提供帮助,我将不胜感激:)我不得不使代码有点泛泛,因为它是相当密码编写的(没有编写方法)。
答案 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)
答案 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);
}
感谢帮助人员