Question : ListView Column Sort By Click Natural Sorting

I found this article http://support.microsoft.com/kb/319401 and used the code there.  I attached the class below.  The problem is when it sorts Numeric Columns for instance my ID column it does a Alphabetic sort not a Natural numeric sort.  For instance my ID's sort out to be 1,10,11,12,13,14,15,16,17,18,19,2,20 instead of 1,2,3,4,5 etc. How can I adjust the code so it handles numeric as well?
Code Snippet:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
using System.Collections;	
using System.Windows.Forms;
 
/// 
/// This class is an implementation of the 'IComparer' interface.
/// 
public class ListViewColumnSorter : IComparer
{
	/// 
	/// Specifies the column to be sorted
	/// 
	private int ColumnToSort;
	/// 
	/// Specifies the order in which to sort (i.e. 'Ascending').
	/// 
	private SortOrder OrderOfSort;
	/// 
	/// Case insensitive comparer object
	/// 
	private CaseInsensitiveComparer ObjectCompare;
 
	/// 
	/// Class constructor.  Initializes various elements
	/// 
	public ListViewColumnSorter()
	{
		// Initialize the column to '0'
		ColumnToSort = 0;
 
		// Initialize the sort order to 'none'
		OrderOfSort = SortOrder.None;
 
		// Initialize the CaseInsensitiveComparer object
		ObjectCompare = new CaseInsensitiveComparer();
	}
 
	/// 
	/// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
	/// 
	/// First object to be compared
	/// Second object to be compared
	/// The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'
	public int Compare(object x, object y)
	{
		int compareResult;
		ListViewItem listviewX, listviewY;
 
		// Cast the objects to be compared to ListViewItem objects
		listviewX = (ListViewItem)x;
		listviewY = (ListViewItem)y;
 
		// Compare the two items
		compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);
			
		// Calculate correct return value based on object comparison
		if (OrderOfSort == SortOrder.Ascending)
		{
			// Ascending sort is selected, return normal result of compare operation
			return compareResult;
		}
		else if (OrderOfSort == SortOrder.Descending)
		{
			// Descending sort is selected, return negative result of compare operation
			return (-compareResult);
		}
		else
		{
			// Return '0' to indicate they are equal
			return 0;
		}
	}
    
	/// 
	/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
	/// 
	public int SortColumn
	{
		set
		{
			ColumnToSort = value;
		}
		get
		{
			return ColumnToSort;
		}
	}
 
	/// 
	/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
	/// 
	public SortOrder Order
	{
		set
		{
			OrderOfSort = value;
		}
		get
		{
			return OrderOfSort;
		}
	}
    
}

Answer : ListView Column Sort By Click Natural Sorting

Have you tried the links I posted before.
These ones especially has an example in how the alphanumerical sorting is done.
http://madebits.com/articles/numsort/index.php
see Example 2 - Ordering Items in a ListView Control.

http://dotnetperls.com/alphanumeric-sorting
See item 2. Implementing IComparer interface
It implement a comparator for alphanumeric sorting in C#. You just need to replace
private CaseInsensitiveComparer ObjectCompare;
with this new class AlphanumComparatorFast:
private AlphanumComparatorFast  ObjectCompare;

public class AlphanumComparatorFast : IComparer
Random Solutions  
 
programming4us programming4us