我正在开发一个利用List对象重载到我创建的结构的程序。
此程序会无限期地不断增加列表的大小。我正在寻找一个算法,当List的大小为50时将触发,消除前25个元素,并将后者25向下移动到前一半,并开始在第26个元素点添加元素。
假设条目和testEntries在上面定义并模板化为我创建的结构。
if(entries.Count >= 50)
{
testEntries = entries;
int x = 0;
for (x = 0; x < (entries.Count / 2); x++)
{
testEntries.RemoveAt(x);
}
for (x = 0; x < (entries.Count); x++)
{
testEntries.Add(entries[entries.Count / 2]);
}
entries = testEntries;
}
//条目是我的原始列表,testEntries是我的第二个帮助操作的列表。
答案 0 :(得分:2)
List的默认实现(框架中的任何IList)*保持具有连续索引的项目。也就是说,一旦你删除了一个项目,列表后面的所有项目都将移回一个位置。要清楚,如果你有:
0 -> A
1 -> B
2 -> C
3 -> D
如果您移除B
,则C
和D
会移回一个空格:
0 -> A
1 -> C
2 -> D
*:您使用的是List的自定义实现吗?
知道,因为你要在列表的开头删除,你可以在第一个位置删除所需数量的项目:
if(entries.Count >= 50)
{
testEntries = entries;
int x = 0;
for (x = 0; x < (entries.Count / 2); x++)
{
testEntries.RemoveAt(0); // <--- Always removing the first item
}
//No need
/*for (x = 0; x < (entries.Count); x++)
{
testEntries.Add(entries[entries.Count / 2]);
}*/
entries = testEntries;
}
您可能还想考虑是否要删除前半部分,前25个项目或者只剩下25个项目。上面的代码删除了上半部分。
要删除前25个,请使用for (x = 0; x < (entries.Count / 2); x++)
更改for (x = 0; x < 25; x++)
。要删除,直到有25个项目,我建议一段时间:
if(entries.Count >= 50)
{
testEntries = entries;
while (entries.Count > 25)
{
testEntries.RemoveAt(0);
}
entries = testEntries;
}
如果您有一个不保留连续索引的自定义列表......您可以从将后半部分复制到上半部分开始。之后你可以删除下半部分。
if(entries.Count >= 50)
{
testEntries = entries;
int x = 0;
int pivot = (entries.Count / 2);
//Copy
for (x = pivot; x < entries.Count; x++)
{
testEntries[x - pivot] = testEntries[x];
}
//Remove
for (x = pivot; x < entries.Count; x++)
{
testEntries.RemoveAt(x);
}
entries = testEntries;
}
这些都不是线程安全的。如果您有多个线程同时访问您的对象,可能会导致意外的结果。您应该考虑使用某种形式的同步。我认为可以创建一个无锁解决方案,这超出了本文的范围。