diff --git a/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs b/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs index 2f5a16a..17180f0 100644 --- a/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs +++ b/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs @@ -400,10 +400,19 @@ namespace ICD.Common.Utils.Tests.Extensions [Test] public void UnanimousTest() { - Assert.IsTrue(new[] {true, true, true}.Unanimous()); - Assert.IsTrue(new[] {false, false, false}.Unanimous()); - Assert.IsFalse(new[] {false, true, false}.Unanimous()); - Assert.IsFalse(new bool[] { }.Unanimous()); + bool result; + + Assert.IsTrue(new[] {true, true, true}.Unanimous(out result)); + Assert.IsTrue(result); + + Assert.IsTrue(new[] {false, false, false}.Unanimous(out result)); + Assert.IsFalse(result); + + Assert.IsFalse(new[] {false, true, false}.Unanimous(out result)); + Assert.AreEqual(default(bool), result); + + Assert.IsFalse(new bool[] { }.Unanimous(out result)); + Assert.AreEqual(default(bool), result); } [Test] diff --git a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs index ac0326a..e51582f 100644 --- a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs +++ b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs @@ -865,8 +865,8 @@ namespace ICD.Common.Utils.Extensions if (extends == null) throw new ArgumentNullException("extends"); - T[] array = extends.Distinct().ToArray(); - return array.Length == 1 ? array[0] : other; + T item; + return extends.Unanimous(out item) ? item : other; } /// @@ -875,14 +875,57 @@ namespace ICD.Common.Utils.Extensions /// Returns true if the sequence is non-empty and all elements are the same. /// /// + /// /// [PublicAPI] - public static bool Unanimous(this IEnumerable extends) + public static bool Unanimous(this IEnumerable extends, out T result) { if (extends == null) throw new ArgumentNullException("extends"); - return extends.Distinct().Count() == 1; + return extends.Unanimous(EqualityComparer.Default, out result); + } + + /// + /// Returns false if the sequence is empty. + /// Returns false if the sequence is non-empty and there are two different elements. + /// Returns true if the sequence is non-empty and all elements are the same. + /// + /// + /// + /// + /// + [PublicAPI] + public static bool Unanimous(this IEnumerable extends, IEqualityComparer comparer, out T result) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (comparer == null) + throw new ArgumentNullException("comparer"); + + result = default(T); + T output = default(T); + bool empty = true; + + foreach (T entry in extends) + { + if (empty) + { + empty = false; + output = entry; + continue; + } + + if (!comparer.Equals(entry, output)) + return false; + } + + if (empty) + return false; + + result = output; + return true; } ///