所以我有一个字典看起来像这样:
var newDictionary = new Dictionary<int, string>();
此词典中的int(键)是项目的oder编号。
所以说我有一个这样的列表
{1,&#34; item1&#34; } {2,&#34; item2&#34; } {3,&#34; item3&#34; } {4,&#34; item4&#34; }
在我的控制器中,我传递了旧项目订单号,以及新订单号应该是什么。 例如,如果我想移动&#34; item3&#34;我将传递给控制器3(旧订单号)和1(新订单号)的第一个项目。 所以我的列表看起来像这样:
{1,&#34; item3&#34; } {2,&#34; item1&#34; } {3,&#34; item2&#34; } {4,&#34; item4&#34; }
答案 0 :(得分:2)
这不是您通常使用字典的类型。您可以考虑使用List而不是Dictionary,并在列表中使用RemoveAt和InsertAt方法。如果您的列表变得非常大,您可能需要考虑另一种处理方式(出于性能原因),但对于少量数据,它应该可以正常工作。
答案 1 :(得分:1)
这样看:
您不会更改商品订单,但会将关键点的值更改为。项目的有效顺序在字典中无关紧要,但重要的是指向值的键。
您想要的是,下次有人要求newDictionary[1]
会像内容一样收到"Item3"
。
示例:
//swap
string val1 = d[1];
string val3 = d[3];
d[1] = val3;
d[3] = val1;
顺便说一下,如果你需要一些特定的订单,那就有SortedDictionary。
答案 2 :(得分:1)
好的,感谢所有的答案,但不幸的是,大多数建议的内容都无法满足我的需求。然而,这就是我设法做到这一点的方式:
public void ReorderDictionary(int oldIndex, int newIndex)
{
var oldDictionary = new Dictionary<int, string>();
oldDictionary.Add(1, "item1");
oldDictionary.Add(2, "item2");
oldDictionary.Add(3, "item3");
oldDictionary.Add(4, "item4");
var movedItem = oldDictionary[oldIndex];
oldDictionary.Remove(oldIndex);
var newDictionary = new Dictionary<int, string>();
var offset = 0;
for (var i = 0; i < oldDictionary.Count; i++)
{
if (i + 1 == newIndex)
{
newDictionary.Add(i, movedItem);
offset = 1;
}
var oldEvent = oldDictionary[oldDictionary.Keys.ElementAt(i)];
newDictionary.Add(i + offset, oldEvent);
}
if (newIndex > oldDictionary.Count)
{
newDictionary.Add(oldDictionary.Count + 1, movedItem);
}
}
可能不是最好的方法,但不幸的是我必须使用过时的系统。但至少这有用:D
答案 3 :(得分:0)
我在Console应用程序中尝试了一些东西。希望这能满足您的需求:
public class Program
{
static void Main(string[] args)
{
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "item1");
dictionary.Add(2, "item2");
dictionary.Add(3, "item3");
dictionary.Add(4, "item4");
Dictionary<int, string> sortedDic = ResortDictionary(dictionary, 1, 4);
foreach (KeyValuePair<int, string> row in sortedDic)
{
Console.WriteLine("Key: " + row.Key + " Value: " + row.Value);
}
Console.ReadLine();
}
public static Dictionary<int, string> ResortDictionary(Dictionary<int, string> dictionary, int oldOrderNumber, int newOrderNumber)
{
string oldOrderNumberValue = dictionary[oldOrderNumber];
string newOrderNumberValue = dictionary[newOrderNumber];
dictionary[newOrderNumber] = oldOrderNumberValue;
dictionary[oldOrderNumber] = newOrderNumberValue;
return dictionary;
}
}
答案 4 :(得分:0)
如果您希望在重新排序方法中缩短使用foreach的时间,
private static Dictionary<int, string> ReorderDictionary(Dictionary<int, string> originalDictionary, int newTopItem)
{
// Initialize ordered dictionary with new top item.
var reorderedDictionary = new Dictionary<int, string> {{ newTopItem, originalDictionary[newTopItem] }};
foreach (var item in originalDictionary)
{
if (item.Key == newTopItem)
{
// Skip the new top item.
continue;
}
reorderedDictionary.Add(item.Key, item.Value);
}
return reorderedDictionary;
}