【问题标题】:Sort ListBox numerically in C#在 C# 中对 ListBox 进行数字排序
【发布时间】:2012-09-29 19:25:59
【问题描述】:

我试图对一个充满数字的列表框进行排序。为什么这不起作用?

        {
            ArrayList Sorting = new ArrayList();
            Sorting.Add (lbNumbers.Text);
            int[] items = new int[Sorting.Count];
            Sorting.CopyTo(items);
            Array.Sort(items);
            lbNumbers.Items.Add(items);

        }

【问题讨论】:

  • lbNumbers.Text 大概是string。你不能把string输入int[]
  • 是这样的排序顺序:1, 10, 100, 11, 2, 21, 23, 233 ....
  • 也许.. Sorting.Add (lbNumbers.Text);
  • 很难阅读你的代码。您将字符串存储在非通用 ArrayList 中,然后将它们复制到一个新的整数数组中......这段代码真是一团糟。
  • 尝试转换你添加的字符串:sorting.Add(Int32.Parse(lbNumbers.Text));

标签: c# arrays listbox arraylist


【解决方案1】:

可能是因为当您的数字表示为字符串时,它们不会按照您期望的方式排序。它们将按字符串而非数字排序。

例如,如果您有如下列表:

10
9
101

排序如下:

10
101
9

【讨论】:

    【解决方案2】:

    首先,解析字符串元素,然后排序。

    // the itemList is your lbNumbers.Text
    var itemList = new List<string> {"9", "1", "10", "11"};
    
    // use TryParse if you're not sure if really all elements are numbers
    var numberList = itemList.Select(int.Parse).ToList();
    numberList.Sort();
    

    【讨论】:

      【解决方案3】:
      ArrayList Sorting = new ArrayList(); 
      
      foreach (var o in listBox1.Items) {
          Sorting.Add(o);
      } 
      
      Sorting.Sort(); 
      
      listBox1.Items.Clear();
      
      foreach (var o in Sorting) {
          listBox1.Items.Add(o); 
      }
      

      添加:对于降序排序,

      1.创建一个ReverseSort类,如下图:

      // implementation:
      public class ReverseSort : IComparer
      {
          public int Compare(object x, object y)
          {
              // reverse the arguments
              return Comparer.Default.Compare(y, x);
          }    
      }
      

      2.将Sort的代码行替换为这一行:

      Sorting.Sort(new ReverseSort());
      

      【讨论】:

      • 没关系这个代码有效。谢谢你。我要添加什么以使其向相反方向排序?上升而不是下降?
      【解决方案4】:

      您正在排序 lbNumbers.Text => 字符串

      【讨论】:

        【解决方案5】:

        您必须在排序前clear

        ArrayList arrayList = new ArrayList(); 
        foreach (object o in lbNumbers.Items) 
        {
           arrayList.Add(o);
        }
        
        arrayList.Sort(); 
        
        lbNumbers.Items.Clear();
        
        foreach(object o in arrayList)
        {
            lbNumbers.Items.Add(o); 
        }
        

        【讨论】:

          【解决方案6】:

          使用一点 LINQ

                  string list = "1,24,3,10,12,11";
          
                  //Split the string into the tokens containing the numbers
                  string[] tokens = list.Split(',');
          
                  //Parse each string representing an integer into an integer
                  //return the resultant object as an array of integers
                  int[] sorting = tokens.Select(x => int.Parse(x)).ToArray<int>();
          
                  //Sort them numerically and return as an array of integers
                  sorting = sorting.OrderBy(x => x).ToArray<int>();
          
                  //Display them to convince ourselves it works.
                  foreach (int x in sorting)
                  {
                      Console.WriteLine(x);
                  }
          
                  Console.ReadLine();
          

          解析和排序可以在同一个语句中完成,但为了便于阅读,这里分开了。

          【讨论】:

            【解决方案7】:

            试试这个例子:

            
            
                listBox1.Items.Add(3);
                listBox1.Items.Add(1);
                listBox1.Items.Add(2);
            
                ArrayList sort = new ArrayList();
                foreach (object item in listBox1.Items)
                {
                    sort.Add(item);
                }
                sort.Sort();
                listBox1.Items.Clear();
                foreach (int item in sort)
                {
                    listBox1.Items.Add(item);
                }
            
            

            你试图做的是只阅读选定的文本。这样您就可以将列表框中的所有项目放入一个数组列表中,对它们进行排序,然后将它们重新添加回列表框。

            请记住,所有未排序的项目仍然存在,因此您需要先清除列表框。 listBox1.Items.Clear(); 就是这样做的

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-03-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多