当Key等于订单号时,如何在字典中移动项目?

时间:2014-05-28 10:36:08

标签: c# dictionary

所以我有一个字典看起来像这样:

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

5 个答案:

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