Dictionary排序

有时候由于某些要求会对Dictionary排序,一般有两种方法。

1、使用SortedDictionary。

这种自动会对保存的值进行排序。

  1. static void Main(string[] args)
  2. {
  3. SortedDictionary<int,
    object> testDictioary = new SortedDictionary<int,
    object>();
  4. int flag = 0;
  5. do
  6. {
  7. Random random = new Random();
  8. int temp = random.Next(100);
  9. if (!testDictioary.ContainsKey(temp))
  10. {
  11. testDictioary.Add(temp, null);
  12. }
  13. flag = testDictioary.Count;
  14. } while (flag < 20);
  15. Console.WriteLine("未排序前:");
  16. foreach (int key
    in testDictioary.Keys)
  17. {
  18. Console.Write(string.Format(@"{0}  ", key));
  19. }
 static void Main(string[] args)
 {
      SortedDictionary<int, object> testDictioary = new SortedDictionary<int, object>();
            int flag = 0;

            do
            {
                Random random = new Random();

                int temp = random.Next(100);

                if (!testDictioary.ContainsKey(temp))
                {
                    testDictioary.Add(temp, null);
                }

                flag = testDictioary.Count;

            } while (flag < 20);

            Console.WriteLine("未排序前:");

            foreach (int key in testDictioary.Keys)
            {
                Console.Write(string.Format(@"{0}  ", key));
            }
}

结果:

Dictionary排序

2、自己写的方法。如下

  1. public static
    void Sort(Dictionary<int,
    object> dictionary)
  2. {
  3. try
  4. {
  5. List<int> sortList =
    new List<int>();
  6. Dictionary<int,
    object> tempDictionary = new Dictionary<int,
    object>();
  7. foreach (int key
    in dictionary.Keys)
  8. {
  9. sortList.Add(key);
  10. tempDictionary.Add(key, dictionary[key]);
  11. }
  12. int flag = 1;
  13. int i, j;
  14. int itemCount = sortList.Count;
  15. int itemTemp;
  16. for (i = 1; i < itemCount && flag == 1; i++)
  17. {
  18. flag = 0;
  19. for (j = 0; j < itemCount - i; j++)
  20. {
  21. int countfore = sortList[j];
  22. int countback = sortList[j + 1];
  23. if (countfore > countback)
  24. {
  25. flag = 1;
  26. itemTemp = sortList[j];
  27. sortList[j] = sortList[j + 1];
  28. sortList[j + 1] = itemTemp;
  29. }
  30. }
  31. }
  32. dictionary.Clear();
  33. for (int n = 0; n < itemCount; n++)
  34. {
  35. foreach (int tempKey
    in tempDictionary.Keys)
  36. {
  37. int value = sortList[n];
  38. if (tempKey.Equals(value))
  39. {
  40. if (!dictionary.ContainsKey(tempKey))
  41. {
  42. dictionary.Add(tempKey, tempDictionary[tempKey]);
  43. }
  44. }
  45. }
  46. }
  47. }
  48. catch { }
  49. }
 public static void Sort(Dictionary<int, object> dictionary)
        {
            try
            {
                List<int> sortList = new List<int>();

                Dictionary<int, object> tempDictionary = new Dictionary<int, object>();

                foreach (int key in dictionary.Keys)
                {
                    sortList.Add(key);

                    tempDictionary.Add(key, dictionary[key]);
                }

                int flag = 1;

                int i, j;

                int itemCount = sortList.Count;

                int itemTemp;

                for (i = 1; i < itemCount && flag == 1; i++)
                {
                    flag = 0;

                    for (j = 0; j < itemCount - i; j++)
                    {
                        int countfore = sortList[j];

                        int countback = sortList[j + 1];

                        if (countfore > countback)
                        {
                            flag = 1;

                            itemTemp = sortList[j];

                            sortList[j] = sortList[j + 1];

                            sortList[j + 1] = itemTemp;
                        }
                    }
                }
                dictionary.Clear();

                for (int n = 0; n < itemCount; n++)
                {
                    foreach (int tempKey in tempDictionary.Keys)
                    {
                        int value = sortList[n];

                        if (tempKey.Equals(value))
                        {
                            if (!dictionary.ContainsKey(tempKey))
                            {
                                dictionary.Add(tempKey, tempDictionary[tempKey]);
                            }
                        }
                    }
                }
            }
            catch { }
        }

调用结果如下:

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("key为数字");
  4. Dictionary<int,
    object> testDictioary = new Dictionary<int,
    object>();
  5. int flag = 0;
  6. do
  7. {
  8. Random random = new Random();
  9. int temp = random.Next(100);
  10. if (!testDictioary.ContainsKey(temp))
  11. {
  12. testDictioary.Add(temp,
    null);
  13. }
  14. flag = testDictioary.Count;
  15. } while (flag < 20);
  16. Console.WriteLine("未排序前:");
  17. foreach (int key
    in testDictioary.Keys)
  18. {
  19. Console.Write(string.Format(@"{0}  ", key));
  20. }
  21. Console.WriteLine();
  22. CustomMethod.Sort(testDictioary);
  23. Console.WriteLine("排序后:");
  24. foreach (int key
    in testDictioary.Keys)
  25. {
  26. Console.Write(string.Format(@"{0}  ", key));
  27. }
  28. Console.ReadLine();
  29. }
   static void Main(string[] args)
        {
            Console.WriteLine("key为数字");

            Dictionary<int, object> testDictioary = new Dictionary<int, object>();

            int flag = 0;

            do
            {
                Random random = new Random();

                int temp = random.Next(100);

                if (!testDictioary.ContainsKey(temp))
                {
                    testDictioary.Add(temp, null);
                }

                flag = testDictioary.Count;

            } while (flag < 20);

            Console.WriteLine("未排序前:");

            foreach (int key in testDictioary.Keys)
            {
                Console.Write(string.Format(@"{0}  ", key));
            }

            Console.WriteLine();

            CustomMethod.Sort(testDictioary);

            Console.WriteLine("排序后:");

            foreach (int key in testDictioary.Keys)
            {
                Console.Write(string.Format(@"{0}  ", key));
            }

            Console.ReadLine();

        }

Dictionary排序

那么这种方法是否是多此一举呢,因为SortedDictionary完全可以满足排序了。但是有时key会是这样的,100+“ssdd”,或100+20,是字符串类型。这样就能用到上面的方法了。比如以key为100+20这种类型为例。改动一下Sort方法。

  1. public static
    void Sort(Dictionary<string,
    object> dictionary)
  2. {
  3. try
  4. {
  5. List<int> sortList =
    new List<int>();
  6. Dictionary<string,
    object> tempDictionary = new Dictionary<string,
    object>();
  7. foreach (string key
    in dictionary.Keys)
  8. {
  9. int intKey = Convert.ToInt32(key.Substring(0, key.IndexOf("+")));
  10. sortList.Add(intKey);
  11. tempDictionary.Add(key, dictionary[key]);
  12. }
  13. int flag = 1;
  14. int i, j;
  15. int itemCount = sortList.Count;
  16. int itemTemp;
  17. for (i = 1; i < itemCount && flag == 1; i++)
  18. {
  19. flag = 0;
  20. for (j = 0; j < itemCount - i; j++)
  21. {
  22. int countfore = sortList[j];
  23. int countback = sortList[j + 1];
  24. if (countfore > countback)
  25. {
  26. flag = 1;
  27. itemTemp = sortList[j];
  28. sortList[j] = sortList[j + 1];
  29. sortList[j + 1] = itemTemp;
  30. }
  31. }
  32. }
  33. dictionary.Clear();
  34. for (int n = 0; n < itemCount; n++)
  35. {
  36. foreach (string tempKey
    in tempDictionary.Keys)
  37. {
  38. string value = sortList[n].ToString();
  39. if (tempKey.StartsWith(string.Format(@"{0}+", value)))
  40. {
  41. if (!dictionary.ContainsKey(tempKey))
  42. {
  43. dictionary.Add(tempKey, tempDictionary[tempKey]);
  44. }
  45. }
  46. }
  47. }
  48. }
  49. catch { }
  50. }
   public static void Sort(Dictionary<string, object> dictionary)
        {
            try
            {
                List<int> sortList = new List<int>();

                Dictionary<string, object> tempDictionary = new Dictionary<string, object>();

                foreach (string key in dictionary.Keys)
                {
                    int intKey = Convert.ToInt32(key.Substring(0, key.IndexOf("+")));

                    sortList.Add(intKey);

                    tempDictionary.Add(key, dictionary[key]);
                }

                int flag = 1;

                int i, j;

                int itemCount = sortList.Count;

                int itemTemp;

                for (i = 1; i < itemCount && flag == 1; i++)
                {
                    flag = 0;

                    for (j = 0; j < itemCount - i; j++)
                    {
                        int countfore = sortList[j];

                        int countback = sortList[j + 1];

                        if (countfore > countback)
                        {
                            flag = 1;

                            itemTemp = sortList[j];

                            sortList[j] = sortList[j + 1];

                            sortList[j + 1] = itemTemp;
                        }
                    }
                }
                dictionary.Clear();

                for (int n = 0; n < itemCount; n++)
                {
                    foreach (string tempKey in tempDictionary.Keys)
                    {
                        string value = sortList[n].ToString();

                        if (tempKey.StartsWith(string.Format(@"{0}+", value)))
                        {
                            if (!dictionary.ContainsKey(tempKey))
                            {
                                dictionary.Add(tempKey, tempDictionary[tempKey]);
                            }
                        }
                    }
                }
            }
            catch { }
        }

调用:

  1. static
    void Main(string[] args)
  2. {
  3. Console.WriteLine("key为字符串");
  4. Dictionary<string,
    object> testDictioary = new Dictionary<string,
    object>();
  5. int flag = 0;
  6. do
  7. {
  8. Random random = new Random();
  9. int temp = random.Next(100);
  10. int tempValue = random.Next(100);
  11. string keyString =
    string.Format(@"{0}+{1}", temp, tempValue);
  12. if (!testDictioary.ContainsKey(keyString))
  13. {
  14. testDictioary.Add(keyString,
    null);
  15. }
  16. flag = testDictioary.Count;
  17. } while (flag < 20);
  18. Console.WriteLine("未排序前:");
  19. foreach (string key
    in testDictioary.Keys)
  20. {
  21. Console.Write(string.Format(@"{0}  ", key));
  22. }
  23. Console.WriteLine();
  24. CustomOtherSort.Sort(testDictioary);
  25. Console.WriteLine("排序后:");
  26. foreach (string key
    in testDictioary.Keys)
  27. {
  28. Console.Write(string.Format(@"{0}  ", key));
  29. }
  30. Console.ReadLine();
  31. }
         static void Main(string[] args)
        {
            Console.WriteLine("key为字符串");

            Dictionary<string, object> testDictioary = new Dictionary<string, object>();

            int flag = 0;

            do
            {
                Random random = new Random();

                int temp = random.Next(100);

                int tempValue = random.Next(100);

                string keyString = string.Format(@"{0}+{1}", temp, tempValue);

                if (!testDictioary.ContainsKey(keyString))
                {
                    testDictioary.Add(keyString, null);
                }

                flag = testDictioary.Count;

            } while (flag < 20);

            Console.WriteLine("未排序前:");

            foreach (string key in testDictioary.Keys)
            {
                Console.Write(string.Format(@"{0}  ", key));
            }

            Console.WriteLine();

            CustomOtherSort.Sort(testDictioary);

            Console.WriteLine("排序后:");

            foreach (string key in testDictioary.Keys)
            {
                Console.Write(string.Format(@"{0}  ", key));
            }

            Console.ReadLine();

        }

结果:

        Dictionary排序

        详细工程:http://download.csdn.net/detail/yysyangyangyangshan/4114133

上一篇:leetcode 112. Path Sum 、 113. Path Sum II 、437. Path Sum III


下一篇:colorAccent、colorPrimary、colorPrimaryDark actionbar toolbar navigationbar