From 5a723128c22b42050a451c9c4ac6bfcec996a2f2 Mon Sep 17 00:00:00 2001 From: Cory Nelson Date: Tue, 17 Nov 2015 14:55:29 -0600 Subject: [PATCH 1/3] Optimize Enumerable.Skip for IList. --- src/System.Linq/src/System/Linq/Enumerable.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/System.Linq/src/System/Linq/Enumerable.cs b/src/System.Linq/src/System/Linq/Enumerable.cs index 9ed88232d8a2..0c4c5cca325a 100644 --- a/src/System.Linq/src/System/Linq/Enumerable.cs +++ b/src/System.Linq/src/System/Linq/Enumerable.cs @@ -884,7 +884,22 @@ private static IEnumerable TakeWhileIterator(IEnumerable Skip(this IEnumerable source, int count) { if (source == null) throw Error.ArgumentNull("source"); - return SkipIterator(source, count); + + IList sourceList = source as IList; + return sourceList != null ? SkipList(sourceList, count) : SkipIterator(source, count); + } + + private static IEnumerable SkipList(IList source, int count) + { + if (count < 0) + { + count = 0; + } + + while (count < source.Count) + { + yield return source[count++]; + } } private static IEnumerable SkipIterator(IEnumerable source, int count) From c9953f400dc80d6ca7d918d2e8cd8c1d43c0ede2 Mon Sep 17 00:00:00 2001 From: Cory Nelson Date: Tue, 17 Nov 2015 16:45:52 -0600 Subject: [PATCH 2/3] Avoid repeated interface call as suggested by @stephentoub. --- src/System.Linq/src/System/Linq/Enumerable.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/System.Linq/src/System/Linq/Enumerable.cs b/src/System.Linq/src/System/Linq/Enumerable.cs index 0c4c5cca325a..9900832e6672 100644 --- a/src/System.Linq/src/System/Linq/Enumerable.cs +++ b/src/System.Linq/src/System/Linq/Enumerable.cs @@ -896,7 +896,9 @@ private static IEnumerable SkipList(IList source, int count = 0; } - while (count < source.Count) + int sourceCount = source.Count; + + while (count < sourceCount) { yield return source[count++]; } From 7d775acd6db8e23b22bc976dd52ad336d31e5583 Mon Sep 17 00:00:00 2001 From: Cory Nelson Date: Thu, 19 Nov 2015 10:16:22 -0600 Subject: [PATCH 3/3] Revert "Avoid repeated interface call as suggested by @stephentoub." This reverts commit c9953f400dc80d6ca7d918d2e8cd8c1d43c0ede2. --- src/System.Linq/src/System/Linq/Enumerable.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/System.Linq/src/System/Linq/Enumerable.cs b/src/System.Linq/src/System/Linq/Enumerable.cs index 9900832e6672..0c4c5cca325a 100644 --- a/src/System.Linq/src/System/Linq/Enumerable.cs +++ b/src/System.Linq/src/System/Linq/Enumerable.cs @@ -896,9 +896,7 @@ private static IEnumerable SkipList(IList source, int count = 0; } - int sourceCount = source.Count; - - while (count < sourceCount) + while (count < source.Count) { yield return source[count++]; }