diff --git a/src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs b/src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs index 944e0fa4cda70e..22f320d04e57bb 100644 --- a/src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs +++ b/src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs @@ -148,7 +148,11 @@ private static void Fill(IList source, Span destination, int s { if (source.TryGetSpan(out ReadOnlySpan sourceSpan)) { - sourceSpan.Slice(sourceIndex, destination.Length).CopyTo(destination); + if (sourceIndex < sourceSpan.Length) + { + sourceSpan.Slice(sourceIndex, destination.Length).CopyTo(destination); + } + return; } diff --git a/src/libraries/System.Linq/tests/SkipTests.cs b/src/libraries/System.Linq/tests/SkipTests.cs index c05dc7c29f04b3..bb6128403ff265 100644 --- a/src/libraries/System.Linq/tests/SkipTests.cs +++ b/src/libraries/System.Linq/tests/SkipTests.cs @@ -388,5 +388,35 @@ public void DisposeSource(int sourceCount, int count) Assert.False(iterator.MoveNext()); Assert.Equal(-1, state); } + + [Fact] + public void SkipMoreThanCountFollowedByOperators() + { + int[] items = [2, 3]; + + foreach (IEnumerable source in CreateSources([1])) + { + Assert.Equal(items, source.Skip(2).Concat(items).ToArray()); + Assert.Equal(items, source.Skip(2).Concat(items).ToList()); + Assert.Equal(items, source.Skip(2).Append(2).Append(3).ToArray()); + Assert.Equal(items, source.Skip(2).Append(2).Append(3).ToList()); + Assert.Equal(items, items.Concat(source.Skip(2)).ToArray()); + Assert.Equal(items, items.Concat(source.Skip(2)).ToList()); + Assert.Empty(source.Skip(2).Select(x => x * 2).ToArray()); + Assert.Empty(source.Skip(2).Select(x => x * 2).ToList()); + Assert.Empty(source.Skip(2).Where(x => x > 0).ToArray()); + Assert.Empty(source.Skip(2).Where(x => x > 0).ToList()); + Assert.Empty(source.Skip(2).Take(10).ToArray()); + Assert.Empty(source.Skip(2).Take(10).ToList()); + Assert.Empty(source.Skip(2).Skip(1).ToArray()); + Assert.Empty(source.Skip(2).Skip(1).ToList()); + Assert.Empty(source.Skip(2).Distinct().ToArray()); + Assert.Empty(source.Skip(2).Distinct().ToList()); + Assert.Empty(source.Skip(2).OrderBy(x => x).ToArray()); + Assert.Empty(source.Skip(2).OrderBy(x => x).ToList()); + Assert.False(source.Skip(2).Contains(1)); + Assert.False(source.Skip(2).Contains(2)); + } + } } }