It should be something like:
public static bool IsArraySorted(int[] numbers) { bool? ascending = null; for (int i = 1; i < numbers.Length; i++) { if (numbers[i - 1] != numbers[i]) { bool ascending2 = numbers[i - 1] < numbers[i]; if (ascending == null) { ascending = ascending2; } else if (ascending.Value != ascending2) { return false; } } } return true; }
Note the use of the ascending variable to preserve the "direction" of the array. It is initialized for the first time when two different elements are detected.
Note that if you want, you can even return the "direction" of the array:
public static bool IsArraySorted(int[] numbers, out bool isAscending) { isAscending = true; bool? ascending = null;
and inside if (ascending == null)
if (ascending == null) { ascending = ascending2; isAscending = ascending2; }
This is a generic version based on IEnumerable<TSource> :
public static bool IsSorted<TSource>(IEnumerable<TSource> source, out bool isAscending, Comparer<TSource> comparer = null) { isAscending = true; if (comparer == null) { comparer = Comparer<TSource>.Default; } bool first = true; TSource previous = default(TSource); bool? ascending = null; foreach (TSource current in source) { if (!first) { int cmp = comparer.Compare(previous, current); if (cmp != 0) { bool ascending2 = cmp < 0; if (ascending == null) { ascending = ascending2; isAscending = ascending2; } else if (ascending.Value != ascending2) { return false; } } } first = false; previous = current; } return true; }
Note the use of bool first / TSource previous to handle i - 1 (and the fact that the for loop could skip the first element)
xanatos
source share