Перевірка впорядкованості масиву

Для перевірки впорядкованості елементів масиву можна використовувати декілька методів. Розглянемо найпоширеніші з них.

Для початку необхідно створити статичний клас в якому розмістимо методи розширення.

using System;
using System.Collections.Generic;
using System.Linq;

/// <summary>
/// Клас з методами розширення для визначення напрямку сортування
/// </summary>
public static class SortExt
{
}

Перевірка впорядкованності за зростанням

/// <summary>
/// Метод для перевірки масиву на впорядкованість по зростанню
/// </summary>
/// <param name="dataSource">Масив даних</param>
/// <returns>true - дані відсортовані за зростанням, false - в іншому випадку</returns>
public static bool IsSortedAscending<TSource>(this IList<TSource> dataSource) where TSource : IComparable
{
    for (var index = 0; index < dataSource.Count() - 1; index++)
    {
        if (dataSource[index].CompareTo(dataSource[index + 1]) > 0)
        {
            return false;
        }
    }

    return true;
}

Перевірка впорядкованності по спаданню

/// <summary>
/// Метод для перевірки масиву на впорядкованість по спаданню
/// </summary>
/// <param name="dataSource">Масив даних</param>
/// <returns>true - дані відсортовані по спаданню, false - в іншому випадку</returns>
public static bool IsSortedDescending<TSource>(this IList<TSource> dataSource) where TSource : IComparable
{
    for (var index = 0; index < dataSource.Count() - 1; index++)
    {
        if (dataSource[index].CompareTo(dataSource[index + 1]) < 0)
        {
            return false;
        }
    }

    return true;
}

Перевірка з поверненням напряму сортування

В попередніх медодах колекція даних перевірялась на впорядкованість, однак зручно використовувати метод, який перевіряє масив і відповідає на питання в якому напрямку відсортовані дані. Для цього додамо перерахування, яке містить всі можливі стани масиву даних:

/// <summary>
/// Напрям сортування
/// </summary>
[Flags]
public enum SourceSortDirection
{
    /// <summary>
    /// Всі значення рівні
    /// </summary>
    AllEqual = 0b0000,
    /// <summary>
    /// Значення відсортовані за зростанням
    /// </summary>
    Ascending = 0b0001,
    /// <summary>
    /// Значення відсортовані по спаданню
    /// </summary>
    Descending = 0b0010,
    /// <summary>
    /// Значення не відсортовані
    /// </summary>
    Unsorted = AllEqual | Ascending | Descending
}

Додамо метод, який перевіряє напрямок сортування масиву даних:

/// <summary>
/// Метод для отримання напрямку сортування масиву
/// </summary>
/// <typeparam name="TSource">Тип даних масиву</typeparam>
/// <param name="dataSource">Вхідні дані</param>
/// <returns>Напрям сортування</returns>
public static SourceSortDirection SortDirection<TSource>(this IList<TSource> dataSource) where TSource : IComparable
{
    var result = SourceSortDirection.AllEqual;
    for (var index = 0; index < dataSource.Count() - 1; index++)
    {
        var t = dataSource[index].CompareTo(dataSource[index + 1]);
        if (t < 0)
        {
            result |= SourceSortDirection.Ascending;
        }
        else if (t > 0)
        {
            result |= SourceSortDirection.Descending;
        }

        if (result == SourceSortDirection.Unsorted)
        {
            break;
        }
    }

    return result;
}

Приклад використання методів розширення:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var a = new int[] { 1, 2, 3, 4, 4, 5 };
        var b = new double[] { 9, 8, 7, 7, 6, 5 };
        var c = new List<byte> { 1, 1, 1, 1, 1 };
        var d = new char[] { 'H', 'e', 'l', 'l', 'o', '!' };

        Console.WriteLine(a.IsSortedAscending());
        Console.WriteLine(a.IsSortedDescending());
        Console.WriteLine(a.SortDirection());

        Console.WriteLine(b.IsSortedAscending());
        Console.WriteLine(b.IsSortedDescending());
        Console.WriteLine(b.SortDirection());

        Console.WriteLine(c.IsSortedAscending());
        Console.WriteLine(c.IsSortedDescending());
        Console.WriteLine(c.SortDirection());

        Console.WriteLine(d.IsSortedAscending());
        Console.WriteLine(d.IsSortedDescending());
        Console.WriteLine(d.SortDirection());

        Console.ReadLine();
    }
}

Дивіться також: