我遇到了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。这让我感到困惑,并且每一次都让我感到困惑。正如克里斯托夫所说。最好使用你自己的列表,你可以根据需要使用它或深入阅读文档。
答案 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
......会很奇怪。
如果您使用其他密钥类型,则所有这些都更容易看到,例如一个字符串。然后你就不会在键和索引之间感到困惑,因为类型不同,编译器不会让你使用另一个你想要的那个。