diff --git a/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs b/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs index ddfe827..ef0a621 100644 --- a/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs +++ b/ICD.Common.Utils.Tests/Extensions/EnumerableExtensionsTest.cs @@ -3,7 +3,6 @@ using ICD.Common.Utils.Extensions; using NUnit.Framework; using System.Collections.Generic; using System.Linq; -using System; namespace ICD.Common.Utils.Tests.Extensions { @@ -62,6 +61,41 @@ namespace ICD.Common.Utils.Tests.Extensions Assert.AreEqual(true, exists); } + [TestCase(1)] + public void TryLastTest(int expected) + { + IEnumerable sequence = Enumerable.Empty(); + int result; + bool exists = sequence.TryLast(out result); + + Assert.AreEqual(0, result); + Assert.AreEqual(false, exists); + + sequence = new[] { expected }; + exists = sequence.TryLast(out result); + + Assert.AreEqual(expected, result); + Assert.AreEqual(true, exists); + } + + [TestCase(0)] + [TestCase(1)] + public void TryLastPredicateTest(int expected) + { + IEnumerable sequence = Enumerable.Range(1, 10).Except(expected); + int result; + bool exists = sequence.TryLast(i => i == expected, out result); + + Assert.AreEqual(0, result); + Assert.AreEqual(false, exists); + + sequence = new[] { expected }; + exists = sequence.TryLast(i => i == expected, out result); + + Assert.AreEqual(expected, result); + Assert.AreEqual(true, exists); + } + [TestCase(0, 0)] [TestCase(1, 10)] public void TryElementAtTest(int index, int expected) diff --git a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs index 12c148d..02ec582 100644 --- a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs +++ b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs @@ -94,6 +94,55 @@ namespace ICD.Common.Utils.Extensions return false; } + /// + /// Returns true if there is at least 1 item in the sequence. + /// + /// + /// + /// Outputs the last item in the sequence. + /// + public static bool TryLast(this IEnumerable extends, out T item) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + return extends.TryLast(i => true, out item); + } + + /// + /// Returns true if there is at least 1 item in the sequence. + /// + /// + /// + /// + /// Outputs the last item in the sequence. + /// + public static bool TryLast(this IEnumerable extends, Func predicate, out T item) + { + if (extends == null) + throw new ArgumentNullException("extends"); + + if (predicate == null) + throw new ArgumentNullException("predicate"); + + item = default(T); + bool output = false; + + using (IEnumerator iterator = extends.GetEnumerator()) + { + while (iterator.MoveNext()) + { + if (!predicate(iterator.Current)) + continue; + + item = iterator.Current; + output = true; + } + } + + return output; + } + /// /// Returns the true if an element with the given index is in the sequence. ///