SortedList无法正确删除和添加项目

时间:2015-09-10 20:46:02

标签: c# .net list .net-3.5 sortedlist

我遇到了SortedList的问题,其中2个方法给出了2个不同的结果。

//Item Data is one of this sortedList item
var itemPos = Items.IndexOfValue(ItemData);
Item item;
Items.TryGetValue(itemPos, out item);

结果并不那么明显。我将使用数字而不是摘要字母来更好地说明正在发生的事情。

itemPos设置为5.好的!接下来我们尝试从此索引再次获取此项目但不是。它返回null。当然,这不会立即发生。在此之前调用此代码。

    public void MoveItem(int indexFrom, int indexWhere)
    {
        Item itemToSawp;
        Items.TryGetValue(indexFrom, out itemToSawp);
        Items.Remove(indexFrom);
        Items.Add(indexWhere, itemToSawp);
    }

要移动已排序列表中的项目,我们必须删除并再次添加项目。好!调试说操作非常好,我的项目现在已经索引5我将它从索引4移开。其中索引5在方法MoveItem之前是空的。

还是空的?在那个操作之前,我有索引5填充了东西,我称之为简单的Items.Remove(5);

但现在发生了我之前描述过的事情。

值得注意的是,只有当我在索引中向上移动项目时才会发生这种情况,从4-5开始。当我从5-4移动时,一切正常。

你知道这里发生了什么吗?我使用的是.NET 3.5

完整代码

using System;
using System.Collections.Generic;

class Program
{
    static SortedList<int, ItemData> Items = new SortedList<int, ItemData>();

    static void Main(string[] args)
    {
        var Foo = new ItemData();
        Items.Add(0, Foo);
        Items.Add(1, new ItemData());
        Items.Remove(1);
        MoveItem(0, 1);
        var itemPos = Items.IndexOfValue(Foo);
        Console.WriteLine(itemPos);
        //Console should return 1 i think
        ItemData item;
        Items.TryGetValue(itemPos, out item);
    }

    public static void MoveItem(int indexFrom, int indexWhere)
    {
        ItemData itemToSawp;
        Items.TryGetValue(indexFrom, out itemToSawp);
        Items.Remove(indexFrom);
        Items.Add(indexWhere, itemToSawp);
    }

    class ItemData
    {

    }
}
编辑:这有点令人困惑,但是!索引器(看它的名字:P)以参数KEY而不是INDEX。这让我感到困惑,并且每一次都让我感到困惑。正如克里斯托夫所说。最好使用你自己的列表,你可以根据需要使用它或深入阅读文档。

1 个答案:

答案 0 :(得分:2)

您在条目的与条目的索引之间感到困惑。您的<td width="33%" class="content" <h:outputText value="#{marketID.ridehigh}"/> </td> 方法只更改与值关联的键(通过删除旧条目并创建新条目)。在这些行之后:

MoveItem

...集合中只会有一个条目,Items.Add(0, Foo); Items.Add(1, new ItemData()); Items.Remove(1); 将删除/添加,以便不会更改计数。因此MoveItem只能 返回0(如果找不到则返回-1)。

要获得1,您需要找到与该值相关联的,而不是索引。例如:

IndexOfValue

请注意,int index = Items.IndexOfValue(Foo); int key = Items.Keys[index]; Console.WriteLine("Key = {0}", key); // Prints 1 采用,而不是索引 - 所以这一行:

TryGetValue

......会很奇怪。

如果您使用其他密钥类型,则所有这些都更容易看到,例如一个字符串。然后你就不会在键和索引之间感到困惑,因为类型不同,编译器不会让你使用另一个你想要的那个。