C# Sort Number Strings

Data files sometimes contain a leading integer on each line. When you want to sort these lines, you cannot use a textual sort on the strings. Instead, you must take into account the leading number by parsing it. This example demonstrates how this can be done in the C# language.

Sorted letters: A through Z
Input file

2 - pa
2 - zo
23 - zo
3 - ad
3 - za

Required output

2 - pa
2 - zo
3 - ad
3 - za
23 - zo

Parse example

The idea behind this code is that each line, as it is read from the resource file, is also parsed and stored into an object. The leading integer on each line is stored as an int field in the object. The Line object implements IComparable: in CompareTo, it first compares the integer fields and then the characters following.

IndexOf String Examples Substring Examples int.Parse for Integer Conversion IComparable Example With CompareTo ToString Usage List Examples Using StreamReader Foreach Loop Examples
Program that sorts strings with numbers [C#]

using System;
using System.Collections.Generic;
using System.IO;

class Line : IComparable<Line>
{
    int _number;
    string _afterNumber;
    string _line;

    public Line(string line)
    {
	// Get leading integer.
	int firstSpace = line.IndexOf(' ');
	string integer = line.Substring(0, firstSpace);
	this._number = int.Parse(integer);

	// Store string.
	this._afterNumber = line.Substring(firstSpace);
	this._line = line;
    }

    public int CompareTo(Line other)
    {
	// First compare number.
	int result1 = _number.CompareTo(other._number);
	if (result1 != 0)
	{
	    return result1;
	}
	// Second compare part after number.
	return _afterNumber.CompareTo(other._afterNumber);
    }

    public override string ToString()
    {
	return this._line;
    }
}

class Program
{
    static void Main()
    {
	List<Line> list = new List<Line>();
	using (StreamReader reader = new StreamReader("c:\\p.txt"))
	{
	    while (true)
	    {
		string line = reader.ReadLine();
		if (line == null)
		{
		    break;
		}
		list.Add(new Line(line));
	    }
	}
	list.Sort();
	foreach (Line value in list)
	{
	    Console.WriteLine(value);
	}
    }
}

Output

2 - pa
2 - zo
3 - ad
3 - za
23 - zo

Alphanumeric sort

Programming tip

A more general-purpose alphanumeric sorting algorithm would also work in this case. The alphanumeric sort would eliminate the need to parse lines on your own. However, it would also reduce the quality of your object model: the solution presented above makes many things possible by actually storing the integer as a field.

Alphanumeric Sorting

For example, the Line objects could be used to sum all the integers on the lines or compute an average number. Further processing could also be done on the lines as they are added to validate them and report possible errors in the data file.

Summary

The C# programming language

In programming, choosing the right object model for your problem can make a big difference. In this example, using an object that stores the integer as a field allows a custom sorting method to be used. This results in the correct output when the objects are sorted. In the C# language, implementing the IComparable interface and using a custom constructor is one approach that succeeds.

Sort Examples
Dot Net Perls