Skip to content

Commit 965beee

Browse files
committed
Added SkipLast method.
1 parent ab0c981 commit 965beee

File tree

4 files changed

+79
-4
lines changed

4 files changed

+79
-4
lines changed

Main/src/CodeJam.Main.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
<AutoGen>True</AutoGen>
9494
</Compile>
9595
<Compile Include="Algorithms\Algorithms.EqualRange.IComparable.cs" />
96+
<Compile Include="Collections\Enumerable\EnumerableExtensions.SkipLast.cs" />
9697
<Compile Include="Collections\IntervalTree.cs" />
9798
<None Include="Algorithms\Algorithms.EqualRange.tt">
9899
<Generator>TextTemplatingFileGenerator</Generator>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
using JetBrains.Annotations;
6+
7+
namespace CodeJam.Collections
8+
{
9+
partial class EnumerableExtensions
10+
{
11+
/// <summary>
12+
/// Skips a specified number of contiguous elements from the end of a sequence.
13+
/// </summary>
14+
/// <remarks>
15+
/// This operator uses deferred execution and streams its results.
16+
/// </remarks>
17+
/// <typeparam name="T">The type of the elements of <paramref name="source"/>.</typeparam>
18+
/// <param name="source">The sequence to skip the last element of.</param>
19+
/// <param name="count">The number of elements to skip.</param>
20+
/// <returns>
21+
/// An <see cref="IEnumerable{T}"/> that does not contains the specified number of elements from the end of the input sequence.
22+
/// </returns>
23+
[NotNull, Pure]
24+
public static IEnumerable<T> SkipLast<T>([NotNull] this IEnumerable<T> source, int count = 1)
25+
{
26+
Code.NotNull(source, nameof (source));
27+
28+
if (count <= 0)
29+
return Enumerable.Empty<T>();
30+
31+
if (source is ICollection<T> collection)
32+
return count < collection.Count
33+
? source.Take(collection.Count - count)
34+
: Enumerable.Empty<T>();
35+
36+
return SkipLastImpl(source, count);
37+
}
38+
39+
private static IEnumerable<T> SkipLastImpl<T>(IEnumerable<T> source, int count)
40+
{
41+
var queue = new Queue<T>(count);
42+
43+
foreach (var item in source)
44+
{
45+
if (queue.Count == count)
46+
yield return queue.Dequeue();
47+
48+
queue.Enqueue(item);
49+
}
50+
}
51+
}
52+
}

Main/src/Collections/Enumerable/EnumerableExtensions.TakeLast.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ public static IEnumerable<T> TakeLast<T>([NotNull] this IEnumerable<T> source, i
2828
if (count <= 0)
2929
return Enumerable.Empty<T>();
3030

31-
if (source is IList<T> list)
32-
return count < list.Count
33-
? TakeLastImpl(list, count)
34-
: list;
31+
if (source is IList<T> list)
32+
return count < list.Count
33+
? TakeLastImpl(list, count)
34+
: list;
3535

3636
return TakeLastImpl(source, count);
3737
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Linq;
3+
4+
using CodeJam.Strings;
5+
6+
using NUnit.Framework;
7+
8+
namespace CodeJam.Collections
9+
{
10+
partial class EnumerableExtensionTests
11+
{
12+
[TestCase(new[] {3, 1, 8, 0, 6}, ExpectedResult = "3, 1, 8", TestName = nameof(SkipLastTest) + "1")]
13+
[TestCase(new[] {1}, ExpectedResult = "", TestName = nameof(SkipLastTest) + "2")]
14+
[TestCase(new int[0], ExpectedResult = "", TestName = nameof(SkipLastTest) + "3")]
15+
public string SkipLastTest(int[] source) => source.SkipLast(2).Join(", ");
16+
17+
[TestCase(new[] {3, 1, 8, 0, 6}, ExpectedResult = "3, 1, 8", TestName = nameof(SkipLastEnumerableTest) + "1")]
18+
[TestCase(new[] {1}, ExpectedResult = "", TestName = nameof(SkipLastEnumerableTest) + "2")]
19+
[TestCase(new int[0], ExpectedResult = "", TestName = nameof(SkipLastEnumerableTest) + "3")]
20+
public string SkipLastEnumerableTest(int[] source) => source.Select(i => i).SkipLast(2).Join(", ");
21+
}
22+
}

0 commit comments

Comments
 (0)