using System;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;

/// <summary>
/// This static class provides statics methods to naturally sort a datatable column. 
/// </summary>
public static class NaturalSortService
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="table">DataTable with DataRows to be sorted</param>
    /// <param name="ColumnToSort">The name of the column to sort</param>
    /// <returns>Returns an EnumerableRowCollection of a DataRow type. The Collection is sorted naturally in a single column.</returns>
    public static System.Data.EnumerableRowCollection<System.Data.DataRow> Sort(DataTable table, string ColumnToSort)
    {
        //Used to determine numerical values which are placed first in importance.
        Func<string, object> convert = str =>
        {
            int returnInt = 0;
            if (int.TryParse(str, out returnInt))
                return returnInt;
            else
                return str;
        };

        //Using the EnumerableComparer from TestSampleResults.Domain.Services.EnumerableComparer
        var sorted = (from t in table.AsEnumerable()
                        select t).OrderBy(
                    str => Regex.Split(str.Field<string>(ColumnToSort).Replace(" ", ""), "([0-9]+)").Select(convert),
                    new EnumerableComparer<object>());


        return sorted;
    }
}