Custom listbox sorting

2019-01-20 15:09发布

问题:

I need to sort the data contained within a number of listboxes. The user will be able to select between two different types of sorting using radio boxes, one of which is checked by default on form load. I have created the IF statements needed in order to test whether the checked condition is true for that radio button. but i need some help to create the custom sort algorithms.

Each list with contain similar looking data, the only difference in the prefix with which each line starts. For example each line in the first listbox starts with the prefix "G30" and the second listbox will be "G31" and so on. There are 10 listboxes in total (G30-G39 in terms of prefixes).

The first search algorithm has to sort the lines by the number order of the first 13 chars.

Example: This is how the data looks before sorting

G35:45:58:11 JG07
G35:45:20:41 JG01
G35:58:20:21 JG03
G35:66:22:20 JG05
G35:45:85:21 JG02
G35:64:56:11 JG03
G35:76:35:11 JG02
G35:77:97:12 JG03
G35:54:29:11 JG01
G35:55:51:20 JG01
G35:76:24:20 JG06
G35:76:55:11 JG01

and this is how it should look after sorting

G35:45:20:41 JG01
G35:45:58:11 JG07
G35:45:85:21 JG02
G35:54:29:11 JG01
G35:55:51:20 JG01
G35:58:20:21 JG03
G35:64:56:11 JG03
G35:66:22:20 JG05
G35:76:24:20 JG06
G35:76:35:11 JG02
G35:76:55:11 JG01
G35:77:97:12 JG03

as you can see, the prefixes are the same. so it is sorted, lowest first, by the next pair integers, then the next pair and the next but not by the value after "JG".

the second sort algorithm will ignore the first 13 chars and sort by order of the value after "JG", highest first.

any help? theres some rep in it for you :)

thanks in advance

Edit

namespace Jumpgate_Network_Program
{
    partial class ViewForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;


    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.tabconSubsectors = new System.Windows.Forms.TabControl();
        this.tabG30 = new System.Windows.Forms.TabPage();
        this.lstG30 = new System.Windows.Forms.ListBox();
        this.tabG31 = new System.Windows.Forms.TabPage();
        this.lstG31 = new System.Windows.Forms.ListBox();
        this.tabG32 = new System.Windows.Forms.TabPage();
        this.lstG32 = new System.Windows.Forms.ListBox();
        this.tabG33 = new System.Windows.Forms.TabPage();
        this.lstG33 = new System.Windows.Forms.ListBox();
        this.tabG34 = new System.Windows.Forms.TabPage();
        this.lstG34 = new System.Windows.Forms.ListBox();
        this.tabG35 = new System.Windows.Forms.TabPage();
        this.lstG35 = new System.Windows.Forms.ListBox();
        this.tabG36 = new System.Windows.Forms.TabPage();
        this.lstG36 = new System.Windows.Forms.ListBox();
        this.tabG37 = new System.Windows.Forms.TabPage();
        this.lstG37 = new System.Windows.Forms.ListBox();
        this.tabG38 = new System.Windows.Forms.TabPage();
        this.lstG38 = new System.Windows.Forms.ListBox();
        this.tabG39 = new System.Windows.Forms.TabPage();
        this.lstG39 = new System.Windows.Forms.ListBox();
        this.tabSearch = new System.Windows.Forms.TabPage();
        this.btnSearch = new System.Windows.Forms.Button();
        this.txtSearch = new System.Windows.Forms.TextBox();
        this.lstResult = new System.Windows.Forms.ListBox();
        this.label1 = new System.Windows.Forms.Label();
        this.grpOptions = new System.Windows.Forms.GroupBox();
        this.rbtnHighest = new System.Windows.Forms.RadioButton();
        this.rbtnCoord = new System.Windows.Forms.RadioButton();
        this.tabconSubsectors.SuspendLayout();
        this.tabG30.SuspendLayout();
        this.tabG31.SuspendLayout();
        this.tabG32.SuspendLayout();
        this.tabG33.SuspendLayout();
        this.tabG34.SuspendLayout();
        this.tabG35.SuspendLayout();
        this.tabG36.SuspendLayout();
        this.tabG37.SuspendLayout();
        this.tabG38.SuspendLayout();
        this.tabG39.SuspendLayout();
        this.tabSearch.SuspendLayout();
        this.grpOptions.SuspendLayout();
        this.SuspendLayout();
        // 
        // tabconSubsectors
        // 
        this.tabconSubsectors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                    | System.Windows.Forms.AnchorStyles.Left)
                    | System.Windows.Forms.AnchorStyles.Right)));
        this.tabconSubsectors.Controls.Add(this.tabG30);
        this.tabconSubsectors.Controls.Add(this.tabG31);
        this.tabconSubsectors.Controls.Add(this.tabG32);
        this.tabconSubsectors.Controls.Add(this.tabG33);
        this.tabconSubsectors.Controls.Add(this.tabG34);
        this.tabconSubsectors.Controls.Add(this.tabG35);
        this.tabconSubsectors.Controls.Add(this.tabG36);
        this.tabconSubsectors.Controls.Add(this.tabG37);
        this.tabconSubsectors.Controls.Add(this.tabG38);
        this.tabconSubsectors.Controls.Add(this.tabG39);
        this.tabconSubsectors.Controls.Add(this.tabSearch);
        this.tabconSubsectors.Location = new System.Drawing.Point(13, 39);
        this.tabconSubsectors.Name = "tabconSubsectors";
        this.tabconSubsectors.SelectedIndex = 0;
        this.tabconSubsectors.Size = new System.Drawing.Size(282, 305);
        this.tabconSubsectors.TabIndex = 0;
        // 
        // tabG30
        // 
        this.tabG30.Controls.Add(this.lstG30);
        this.tabG30.Location = new System.Drawing.Point(4, 22);
        this.tabG30.Name = "tabG30";
        this.tabG30.Padding = new System.Windows.Forms.Padding(3);
        this.tabG30.Size = new System.Drawing.Size(274, 279);
        this.tabG30.TabIndex = 0;
        this.tabG30.Text = "G30";
        this.tabG30.UseVisualStyleBackColor = true;
        // 
        // lstG30
        // 
        this.lstG30.FormattingEnabled = true;
        this.lstG30.Location = new System.Drawing.Point(7, 7);
        this.lstG30.Name = "lstG30";
        this.lstG30.Size = new System.Drawing.Size(259, 264);
        this.lstG30.TabIndex = 0;
        // 
        // tabG31
        // 
        this.tabG31.Controls.Add(this.lstG31);
        this.tabG31.Location = new System.Drawing.Point(4, 22);
        this.tabG31.Name = "tabG31";
        this.tabG31.Padding = new System.Windows.Forms.Padding(3);
        this.tabG31.Size = new System.Drawing.Size(274, 279);
        this.tabG31.TabIndex = 1;
        this.tabG31.Text = "G31";
        this.tabG31.UseVisualStyleBackColor = true;
        // 
        // lstG31
        // 
        this.lstG31.FormattingEnabled = true;
        this.lstG31.Location = new System.Drawing.Point(8, 7);
        this.lstG31.Name = "lstG31";
        this.lstG31.Size = new System.Drawing.Size(259, 264);
        this.lstG31.TabIndex = 1;
        // 
        // tabG32
        // 
        this.tabG32.Controls.Add(this.lstG32);
        this.tabG32.Location = new System.Drawing.Point(4, 22);
        this.tabG32.Name = "tabG32";
        this.tabG32.Padding = new System.Windows.Forms.Padding(3);
        this.tabG32.Size = new System.Drawing.Size(274, 279);
        this.tabG32.TabIndex = 2;
        this.tabG32.Text = "G32";
        this.tabG32.UseVisualStyleBackColor = true;
        // 
        // lstG32
        // 
        this.lstG32.FormattingEnabled = true;
        this.lstG32.Location = new System.Drawing.Point(8, 7);
        this.lstG32.Name = "lstG32";
        this.lstG32.Size = new System.Drawing.Size(259, 264);
        this.lstG32.TabIndex = 1;
        // 
        // tabG33
        // 
        this.tabG33.Controls.Add(this.lstG33);
        this.tabG33.Location = new System.Drawing.Point(4, 22);
        this.tabG33.Name = "tabG33";
        this.tabG33.Padding = new System.Windows.Forms.Padding(3);
        this.tabG33.Size = new System.Drawing.Size(274, 279);
        this.tabG33.TabIndex = 3;
        this.tabG33.Text = "G33";
        this.tabG33.UseVisualStyleBackColor = true;
        // 
        // lstG33
        // 
        this.lstG33.FormattingEnabled = true;
        this.lstG33.Location = new System.Drawing.Point(8, 7);
        this.lstG33.Name = "lstG33";
        this.lstG33.Size = new System.Drawing.Size(259, 264);
        this.lstG33.TabIndex = 1;
        // 
        // tabG34
        // 
        this.tabG34.Controls.Add(this.lstG34);
        this.tabG34.Location = new System.Drawing.Point(4, 22);
        this.tabG34.Name = "tabG34";
        this.tabG34.Padding = new System.Windows.Forms.Padding(3);
        this.tabG34.Size = new System.Drawing.Size(274, 279);
        this.tabG34.TabIndex = 4;
        this.tabG34.Text = "G34";
        this.tabG34.UseVisualStyleBackColor = true;
        // 
        // lstG34
        // 
        this.lstG34.FormattingEnabled = true;
        this.lstG34.Location = new System.Drawing.Point(8, 7);
        this.lstG34.Name = "lstG34";
        this.lstG34.Size = new System.Drawing.Size(259, 264);
        this.lstG34.TabIndex = 1;
        // 
        // tabG35
        // 
        this.tabG35.Controls.Add(this.lstG35);
        this.tabG35.Location = new System.Drawing.Point(4, 22);
        this.tabG35.Name = "tabG35";
        this.tabG35.Padding = new System.Windows.Forms.Padding(3);
        this.tabG35.Size = new System.Drawing.Size(274, 279);
        this.tabG35.TabIndex = 5;
        this.tabG35.Text = "G35";
        this.tabG35.UseVisualStyleBackColor = true;
        // 
        // lstG35
        // 
        this.lstG35.FormattingEnabled = true;
        this.lstG35.Location = new System.Drawing.Point(8, 7);
        this.lstG35.Name = "lstG35";
        this.lstG35.Size = new System.Drawing.Size(259, 264);
        this.lstG35.TabIndex = 1;
        // 
        // tabG36
        // 
        this.tabG36.Controls.Add(this.lstG36);
        this.tabG36.Location = new System.Drawing.Point(4, 22);
        this.tabG36.Name = "tabG36";
        this.tabG36.Padding = new System.Windows.Forms.Padding(3);
        this.tabG36.Size = new System.Drawing.Size(274, 279);
        this.tabG36.TabIndex = 6;
        this.tabG36.Text = "G36";
        this.tabG36.UseVisualStyleBackColor = true;
        // 
        // lstG36
        // 
        this.lstG36.FormattingEnabled = true;
        this.lstG36.Location = new System.Drawing.Point(8, 7);
        this.lstG36.Name = "lstG36";
        this.lstG36.Size = new System.Drawing.Size(259, 264);
        this.lstG36.TabIndex = 1;
        // 
        // tabG37
        // 
        this.tabG37.Controls.Add(this.lstG37);
        this.tabG37.Location = new System.Drawing.Point(4, 22);
        this.tabG37.Name = "tabG37";
        this.tabG37.Padding = new System.Windows.Forms.Padding(3);
        this.tabG37.Size = new System.Drawing.Size(274, 279);
        this.tabG37.TabIndex = 7;
        this.tabG37.Text = "G37";
        this.tabG37.UseVisualStyleBackColor = true;
        // 
        // lstG37
        // 
        this.lstG37.FormattingEnabled = true;
        this.lstG37.Location = new System.Drawing.Point(8, 7);
        this.lstG37.Name = "lstG37";
        this.lstG37.Size = new System.Drawing.Size(259, 264);
        this.lstG37.TabIndex = 1;
        // 
        // tabG38
        // 
        this.tabG38.Controls.Add(this.lstG38);
        this.tabG38.Location = new System.Drawing.Point(4, 22);
        this.tabG38.Name = "tabG38";
        this.tabG38.Padding = new System.Windows.Forms.Padding(3);
        this.tabG38.Size = new System.Drawing.Size(274, 279);
        this.tabG38.TabIndex = 8;
        this.tabG38.Text = "G38";
        this.tabG38.UseVisualStyleBackColor = true;
        // 
        // lstG38
        // 
        this.lstG38.FormattingEnabled = true;
        this.lstG38.Location = new System.Drawing.Point(8, 7);
        this.lstG38.Name = "lstG38";
        this.lstG38.Size = new System.Drawing.Size(259, 264);
        this.lstG38.TabIndex = 1;
        // 
        // tabG39
        // 
        this.tabG39.Controls.Add(this.lstG39);
        this.tabG39.Location = new System.Drawing.Point(4, 22);
        this.tabG39.Name = "tabG39";
        this.tabG39.Padding = new System.Windows.Forms.Padding(3);
        this.tabG39.Size = new System.Drawing.Size(274, 279);
        this.tabG39.TabIndex = 9;
        this.tabG39.Text = "G39";
        this.tabG39.UseVisualStyleBackColor = true;
        // 
        // lstG39
        // 
        this.lstG39.FormattingEnabled = true;
        this.lstG39.Location = new System.Drawing.Point(8, 7);
        this.lstG39.Name = "lstG39";
        this.lstG39.Size = new System.Drawing.Size(259, 264);
        this.lstG39.TabIndex = 1;
        // 
        // tabSearch
        // 
        this.tabSearch.Controls.Add(this.btnSearch);
        this.tabSearch.Controls.Add(this.txtSearch);
        this.tabSearch.Controls.Add(this.lstResult);
        this.tabSearch.Location = new System.Drawing.Point(4, 22);
        this.tabSearch.Name = "tabSearch";
        this.tabSearch.Padding = new System.Windows.Forms.Padding(3);
        this.tabSearch.Size = new System.Drawing.Size(274, 279);
        this.tabSearch.TabIndex = 10;
        this.tabSearch.Text = "Search";
        this.tabSearch.UseVisualStyleBackColor = true;
        // 
        // btnSearch
        // 
        this.btnSearch.Location = new System.Drawing.Point(150, 47);
        this.btnSearch.Name = "btnSearch";
        this.btnSearch.Size = new System.Drawing.Size(75, 19);
        this.btnSearch.TabIndex = 3;
        this.btnSearch.Text = "Search";
        this.btnSearch.UseVisualStyleBackColor = true;
        // 
        // txtSearch
        // 
        this.txtSearch.Location = new System.Drawing.Point(8, 46);
        this.txtSearch.Name = "txtSearch";
        this.txtSearch.Size = new System.Drawing.Size(136, 20);
        this.txtSearch.TabIndex = 2;
        // 
        // lstResult
        // 
        this.lstResult.FormattingEnabled = true;
        this.lstResult.Location = new System.Drawing.Point(8, 72);
        this.lstResult.Name = "lstResult";
        this.lstResult.Size = new System.Drawing.Size(259, 199);
        this.lstResult.TabIndex = 1;
        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
        this.label1.Location = new System.Drawing.Point(13, 13);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(131, 20);
        this.label1.TabIndex = 1;
        this.label1.Text = "Select Subsector";
        // 
        // grpOptions
        // 
        this.grpOptions.Controls.Add(this.rbtnHighest);
        this.grpOptions.Controls.Add(this.rbtnCoord);
        this.grpOptions.Location = new System.Drawing.Point(301, 68);
        this.grpOptions.Name = "grpOptions";
        this.grpOptions.Size = new System.Drawing.Size(101, 72);
        this.grpOptions.TabIndex = 2;
        this.grpOptions.TabStop = false;
        this.grpOptions.Text = "Sort by";
        // 
        // rbtnHighest
        // 
        this.rbtnHighest.AutoSize = true;
        this.rbtnHighest.Location = new System.Drawing.Point(7, 44);
        this.rbtnHighest.Name = "rbtnHighest";
        this.rbtnHighest.Size = new System.Drawing.Size(90, 17);
        this.rbtnHighest.TabIndex = 1;
        this.rbtnHighest.Text = "Highest Level";
        this.rbtnHighest.UseVisualStyleBackColor = true;
        this.rbtnHighest.CheckedChanged += new System.EventHandler(this.rbtnHighest_CheckedChanged);
        // 
        // rbtnCoord
        // 
        this.rbtnCoord.AutoSize = true;
        this.rbtnCoord.Checked = true;
        this.rbtnCoord.Location = new System.Drawing.Point(7, 20);
        this.rbtnCoord.Name = "rbtnCoord";
        this.rbtnCoord.Size = new System.Drawing.Size(84, 17);
        this.rbtnCoord.TabIndex = 0;
        this.rbtnCoord.TabStop = true;
        this.rbtnCoord.Text = "Co-ordinates";
        this.rbtnCoord.UseVisualStyleBackColor = true;
        this.rbtnCoord.CheckedChanged += new System.EventHandler(this.rbtnCoord_CheckedChanged);
        // 
        // ViewForm
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(408, 356);
        this.Controls.Add(this.grpOptions);
        this.Controls.Add(this.label1);
        this.Controls.Add(this.tabconSubsectors);
        this.MaximizeBox = false;
        this.Name = "ViewForm";
        this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        this.Text = "View Jumpgates - JNP";
        this.Load += new System.EventHandler(this.ViewForm_Load);
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ViewForm_FormClosing);
        this.tabconSubsectors.ResumeLayout(false);
        this.tabG30.ResumeLayout(false);
        this.tabG31.ResumeLayout(false);
        this.tabG32.ResumeLayout(false);
        this.tabG33.ResumeLayout(false);
        this.tabG34.ResumeLayout(false);
        this.tabG35.ResumeLayout(false);
        this.tabG36.ResumeLayout(false);
        this.tabG37.ResumeLayout(false);
        this.tabG38.ResumeLayout(false);
        this.tabG39.ResumeLayout(false);
        this.tabSearch.ResumeLayout(false);
        this.tabSearch.PerformLayout();
        this.grpOptions.ResumeLayout(false);
        this.grpOptions.PerformLayout();
        this.ResumeLayout(false);
        this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.TabControl tabconSubsectors;
    private System.Windows.Forms.TabPage tabG30;
    private System.Windows.Forms.TabPage tabG31;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.TabPage tabG32;
    private System.Windows.Forms.TabPage tabG33;
    private System.Windows.Forms.TabPage tabG34;
    private System.Windows.Forms.TabPage tabG35;
    private System.Windows.Forms.TabPage tabG36;
    private System.Windows.Forms.TabPage tabG37;
    private System.Windows.Forms.TabPage tabG38;
    private System.Windows.Forms.TabPage tabG39;
    private System.Windows.Forms.TabPage tabSearch;
    private System.Windows.Forms.CustomListBox lstG30;
    private System.Windows.Forms.GroupBox grpOptions;
    private System.Windows.Forms.RadioButton rbtnHighest;
    private System.Windows.Forms.RadioButton rbtnCoord;
    private System.Windows.Forms.CustomListBox lstG31;
    private System.Windows.Forms.CustomListBox lstG32;
    private System.Windows.Forms.CustomListBox lstG33;
    private System.Windows.Forms.CustomListBox lstG34;
    private System.Windows.Forms.CustomListBox lstG35;
    private System.Windows.Forms.CustomListBox lstG36;
    private System.Windows.Forms.CustomListBox lstG37;
    private System.Windows.Forms.CustomListBox lstG38;
    private System.Windows.Forms.CustomListBox lstG39;
    private System.Windows.Forms.Button btnSearch;
    private System.Windows.Forms.TextBox txtSearch;
    private System.Windows.Forms.ListBox lstResult;
}

}

回答1:

To change the sorting behaviour of a ListBox, you must implement your own ListBox class. I've written the solution for you and tested it.

Right click on your project, select "Add Class..." and enter the class name "CustomListBox". Add the following code into the class between the namespaces:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;  // You need this namespace for ListBox

public class CustomListBox : ListBox
{
    public CustomListBox()
        : base()
    {
    }

    protected override void Sort()
    {
        if (this.Items.Count > 1)
        {
            bool swapped;
            do
            {

                int counter = this.Items.Count - 1;
                swapped = false;

                while (counter > 0)
                {
                    if (this.Items[counter].ToString().CompareTo(
                        this.Items[counter - 1].ToString()) == -1)
                    {
                        object temp = Items[counter];
                        this.Items[counter] = this.Items[counter - 1];
                        this.Items[counter - 1] = temp;
                        swapped = true;
                    }

                    counter -= 1;

                }

            }
            while (swapped);
        }
    }
}

All you need to do with your sorting is to sort alphabetically. As per my example above, you can just use the CompareTo method to determine which string comes before or after another string.

Now you've got your own custom ListBox, you can add additional properties and fields to it:

public class CustomListBox : ListBox
{
    public bool SortByJG;

    // Other code...
}

Then you can change the sort method to change the search based on the current sort mode as follows:

while (counter > 0)
{
    bool swap;
    if (this.SortByJG)
    {
        string[] breakDownCurrent = this.Items[counter].ToString().Split(' ');
        string[] breakDownPrevious = this.Items[counter - 1].ToString().Split(' ');
        if (breakDownCurrent[1].CompareTo(breakDownPrevious[1]) == -1)
        {
            swap = true;
        }
    }
    else
    {
        if (this.Items[counter].ToString().CompareTo(
            this.Items[counter - 1].ToString()) == -1)
        {
            swap = true;
        }
    }

    if (swap)
    {
        object temp = Items[counter];
        this.Items[counter] = this.Items[counter - 1];
        this.Items[counter - 1] = temp;
        swapped = true;
    }

    counter -= 1;

}

To make the sorting work, set Sorted = true; on the ListBox.

UPDATE: Because the OP is struggling to understand, here's the entire class:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;  // You need this namespace for ListBox

namespace WindowsApplication1
{

    public class CustomListBox : ListBox
    {

        public CustomListBox()
            : base()
        {
        }

        public bool SortByJG;

        protected override void Sort()
        {

            if (this.Items.Count > 1)
            {
                bool swapped;
                do
                {

                    int counter = this.Items.Count - 1;
                    swapped = false;

                    while (counter > 0)
                    {
                        bool swap = false;
                        if (this.SortByJG)
                        {
                            string[] breakDownCurrent = this.Items[counter].ToString().Split(' ');
                            string[] breakDownPrevious = this.Items[counter - 1].ToString().Split(' ');
                            if (breakDownCurrent[1].CompareTo(breakDownPrevious[1]) == -1)
                            {
                                swap = true;
                            }
                        }
                        else
                        {
                            if (this.Items[counter].ToString().CompareTo(
                                this.Items[counter - 1].ToString()) == -1)
                            {
                                swap = true;
                            }
                        }

                        if (swap)
                        {
                            object temp = Items[counter];
                            this.Items[counter] = this.Items[counter - 1];
                            this.Items[counter - 1] = temp;
                            swapped = true;
                        }

                        counter -= 1;

                    }


                }
                while (swapped);
            }
        }
    }
}

You could now also add your own method to sort with the specified mode:

public void Sort(bool sortByJG)
{
   this.SortByJG = sortByJG;
   if (this.Sorted)
   {
      this.Sort();
   }
   else
   {
      this.Sorted = true;
   }
}


回答2:

The first algorithm is the same as alphabetic ordering, so you can use directly:

int res = string.Compare(first,second);

The second algorithm is descending alphabetic ordering of the last two chars:

int res = -string.Compare(first.Substring(first.Length - 2, 2), second.Substring(first.Length - 2, 2));

To sort the list you have two options; the first is to create your own ListBox subclass and override the Sort method as detailed on the MSDN page for ListBox.Sort Method.

The second (easier and uglier) is to put all the items in a collection, order the collection and replace the items in the list, something like this:

using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {

        void SortListBox() {
            List<string> items = new List<string>();
            foreach (string value in listBox1.Items) {
                items.Add(value);
            }
            items.Sort((first, second) => string.Compare(first, second));
            listBox1.Items.Clear();
            listBox1.Items.AddRange(items.ToArray());
        }

    }
}

Hope this helps...