Для перевірки впорядкованості елементів масиву можна використовувати декілька методів. Розглянемо найпоширеніші з них.
Для початку необхідно створити статичний клас в якому розмістимо методи розширення.
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();
}
}