diff --git a/src/libraries/System.Linq/src/System/Linq/First.cs b/src/libraries/System.Linq/src/System/Linq/First.cs index 95ada9a81cf4ea..8763d207c133de 100644 --- a/src/libraries/System.Linq/src/System/Linq/First.cs +++ b/src/libraries/System.Linq/src/System/Linq/First.cs @@ -89,11 +89,6 @@ private static TSource TryGetFirst(this IEnumerable source, Fu ThrowHelper.ThrowArgumentNullException(ExceptionArgument.predicate); } - if (source is OrderedEnumerable ordered) - { - return ordered.TryGetFirst(predicate, out found); - } - foreach (TSource element in source) { if (predicate(element)) diff --git a/src/libraries/System.Linq/src/System/Linq/OrderedEnumerable.cs b/src/libraries/System.Linq/src/System/Linq/OrderedEnumerable.cs index da0ed0c7c47692..f28f7efa672de5 100644 --- a/src/libraries/System.Linq/src/System/Linq/OrderedEnumerable.cs +++ b/src/libraries/System.Linq/src/System/Linq/OrderedEnumerable.cs @@ -73,40 +73,6 @@ internal IEnumerator GetEnumerator(int minIdx, int maxIdx) IOrderedEnumerable IOrderedEnumerable.CreateOrderedEnumerable(Func keySelector, IComparer? comparer, bool descending) => new OrderedEnumerable(_source, keySelector, comparer, @descending, this); - [return: MaybeNull] - public TElement TryGetFirst(Func predicate, out bool found) - { - CachingComparer comparer = GetComparer(); - using (IEnumerator e = _source.GetEnumerator()) - { - TElement value; - do - { - if (!e.MoveNext()) - { - found = false; - return default!; - } - - value = e.Current; - } - while (!predicate(value)); - - comparer.SetElement(value); - while (e.MoveNext()) - { - TElement x = e.Current; - if (predicate(x) && comparer.Compare(x, true) < 0) - { - value = x; - } - } - - found = true; - return value; - } - } - [return: MaybeNull] public TElement TryGetLast(Func predicate, out bool found) { diff --git a/src/libraries/System.Linq/tests/OrderByTests.cs b/src/libraries/System.Linq/tests/OrderByTests.cs index 8c99b5668c763f..627becd98800b5 100644 --- a/src/libraries/System.Linq/tests/OrderByTests.cs +++ b/src/libraries/System.Linq/tests/OrderByTests.cs @@ -291,6 +291,38 @@ public void FirstOnEmptyOrderedThrows() Assert.Throws(() => Enumerable.Empty().OrderBy(i => i).First()); } + [Fact] + public void FirstWithPredicateOnOrdered() + { + IEnumerable orderBy = Enumerable.Range(0, 10).Shuffle().OrderBy(i => i); + IEnumerable orderByDescending = Enumerable.Range(0, 10).Shuffle().OrderByDescending(i => i); + int counter; + + counter = 0; + Assert.Equal(0, orderBy.First(i => { counter++; return true; })); + Assert.Equal(1, counter); + + counter = 0; + Assert.Equal(9, orderBy.First(i => { counter++; return i == 9; })); + Assert.Equal(10, counter); + + counter = 0; + Assert.Throws(() => orderBy.First(i => { counter++; return false; })); + Assert.Equal(10, counter); + + counter = 0; + Assert.Equal(9, orderByDescending.First(i => { counter++; return true; })); + Assert.Equal(1, counter); + + counter = 0; + Assert.Equal(0, orderByDescending.First(i => { counter++; return i == 0; })); + Assert.Equal(10, counter); + + counter = 0; + Assert.Throws(() => orderByDescending.First(i => { counter++; return false; })); + Assert.Equal(10, counter); + } + [Fact] public void FirstOrDefaultOnOrdered() { @@ -300,6 +332,38 @@ public void FirstOrDefaultOnOrdered() Assert.Equal(0, Enumerable.Empty().OrderBy(i => i).FirstOrDefault()); } + [Fact] + public void FirstOrDefaultWithPredicateOnOrdered() + { + IEnumerable orderBy = Enumerable.Range(0, 10).Shuffle().OrderBy(i => i); + IEnumerable orderByDescending = Enumerable.Range(0, 10).Shuffle().OrderByDescending(i => i); + int counter; + + counter = 0; + Assert.Equal(0, orderBy.FirstOrDefault(i => { counter++; return true; })); + Assert.Equal(1, counter); + + counter = 0; + Assert.Equal(9, orderBy.FirstOrDefault(i => { counter++; return i == 9; })); + Assert.Equal(10, counter); + + counter = 0; + Assert.Equal(0, orderBy.FirstOrDefault(i => { counter++; return false; })); + Assert.Equal(10, counter); + + counter = 0; + Assert.Equal(9, orderByDescending.FirstOrDefault(i => { counter++; return true; })); + Assert.Equal(1, counter); + + counter = 0; + Assert.Equal(0, orderByDescending.FirstOrDefault(i => { counter++; return i == 0; })); + Assert.Equal(10, counter); + + counter = 0; + Assert.Equal(0, orderByDescending.FirstOrDefault(i => { counter++; return false; })); + Assert.Equal(10, counter); + } + [Fact] public void LastOnOrdered() {