From 52229c1472e565bec34b1a6995286a8566dc4928 Mon Sep 17 00:00:00 2001 From: Chris Cameron Date: Sun, 29 Sep 2019 21:56:19 -0400 Subject: [PATCH] feat: Adding AreOrdered enumerable extension methods --- CHANGELOG.md | 1 + .../Extensions/EnumerableExtensionsTest.cs | 9 ++++ .../Extensions/EnumerableExtensions.cs | 44 +++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8f548c..18acc97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - IcdEnvironment.GetUtcTime() to get UTC representaiton of current time. + - Extension methods for determining if a sequence is in order ## [9.9.0] - 2019-09-16 ### Added diff --git a/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs b/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs index 2de5281..dbe4261 100644 --- a/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs +++ b/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs @@ -284,6 +284,15 @@ namespace ICD.Common.Utils.Tests.Extensions Assert.AreEqual(5, items.Length); } + [TestCase(true)] + [TestCase(true, 1, 2, 3, 4)] + [TestCase(true, 1, 2, 2, 3, 4)] + [TestCase(false, 4, 3, 2, 1)] + public void AreOrderedTest(bool expected, params int[] items) + { + Assert.AreEqual(expected, items.AreOrdered()); + } + [Test] public void OrderTest() { diff --git a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs index 6c977cb..ada0f46 100644 --- a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs +++ b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs @@ -648,6 +648,50 @@ namespace ICD.Common.Utils.Extensions yield return default(T); } + /// + /// Returns true if the given sequence is ordered. + /// + /// + /// + /// + public static bool AreOrdered(this IEnumerable extends) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + return extends.AreOrdered(Comparer.Default); + } + + /// + /// Returns true if the given sequence is ordered. + /// + /// + /// + /// + /// + public static bool AreOrdered(this IEnumerable extends, IComparer comparer) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (comparer == null) + throw new ArgumentNullException("comparer"); + + bool first = true; + T previous = default(T); + + foreach (T item in extends) + { + if (!first && comparer.Compare(item, previous) < 0) + return false; + + first = false; + previous = item; + } + + return true; + } + /// /// Default ordering for the items in the sequence. ///