c# - 列出对象元素翻转

时间:2013-01-27 06:28:29

标签: c# list

我正在开发一个利用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是我的第二个帮助操作的列表。

1 个答案:

答案 0 :(得分:2)

List的默认实现(框架中的任何IList)*保持具有连续索引的项目。也就是说,一旦你删除了一个项目,列表后面的所有项目都将移回一个位置。要清楚,如果你有:

 0 -> A
 1 -> B
 2 -> C
 3 -> D

如果您移除B,则CD会移回一个空格:

 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;
}

最后的注释

这些都不是线程安全的。如果您有多个线程同时访问您的对象,可能会导致意外的结果。您应该考虑使用某种形式的同步。我认为可以创建一个无锁解决方案,这超出了本文的范围。