Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Prev Previous commit
Next Next commit
Implement SegmentedArrayBuilder for SkipTake and Where iterators
  • Loading branch information
andrewjsaid committed Jul 2, 2024
commit c49c2a0ee2cd905316b80825e2e779ea63d337d9
13 changes: 9 additions & 4 deletions src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -491,25 +491,30 @@ public override TSource[] ToArray()

public override List<TSource> ToList()
{
var list = new List<TSource>();

using (IEnumerator<TSource> en = _source.GetEnumerator())
{
if (SkipBeforeFirst(en) && en.MoveNext())
{
int remaining = Limit - 1; // Max number of items left, not counting the current element.
int comparand = HasLimit ? 0 : int.MinValue; // If we don't have an upper bound, have the comparison always return true.

SegmentedArrayBuilder<TSource>.ScratchBuffer scratch = default;
SegmentedArrayBuilder<TSource> builder = new(scratch);
do
{
remaining--;
list.Add(en.Current);
builder.Add(en.Current);
}
while (remaining >= comparand && en.MoveNext());

List<TSource> result = builder.ToList();
builder.Dispose();

return result;
}
}

return list;
return [];
}

private bool SkipBeforeFirst(IEnumerator<TSource> en) => SkipBefore(_minIndexInclusive, en);
Expand Down
40 changes: 28 additions & 12 deletions src/libraries/System.Linq/src/System/Linq/Where.SpeedOpt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,22 @@ public override TSource[] ToArray()

public override List<TSource> ToList()
{
var list = new List<TSource>();
SegmentedArrayBuilder<TSource>.ScratchBuffer scratch = default;
SegmentedArrayBuilder<TSource> builder = new(scratch);

Func<TSource, bool> predicate = _predicate;
foreach (TSource item in _source)
{
if (predicate(item))
{
list.Add(item);
builder.Add(item);
}
}

return list;
List<TSource> result = builder.ToList();
builder.Dispose();

return result;
}

public override TSource? TryGetFirst(out bool found)
Expand Down Expand Up @@ -199,17 +203,21 @@ public static TSource[] ToArray(ReadOnlySpan<TSource> source, Func<TSource, bool

public static List<TSource> ToList(ReadOnlySpan<TSource> source, Func<TSource, bool> predicate)
{
var list = new List<TSource>();
SegmentedArrayBuilder<TSource>.ScratchBuffer scratch = default;
SegmentedArrayBuilder<TSource> builder = new(scratch);

foreach (TSource item in source)
{
if (predicate(item))
{
list.Add(item);
builder.Add(item);
}
}

return list;
List<TSource> result = builder.ToList();
builder.Dispose();

return result;
}

public override TSource? TryGetFirst(out bool found)
Expand Down Expand Up @@ -398,17 +406,21 @@ public static TResult[] ToArray(ReadOnlySpan<TSource> source, Func<TSource, bool

public static List<TResult> ToList(ReadOnlySpan<TSource> source, Func<TSource, bool> predicate, Func<TSource, TResult> selector)
{
var list = new List<TResult>();
SegmentedArrayBuilder<TResult>.ScratchBuffer scratch = default;
SegmentedArrayBuilder<TResult> builder = new(scratch);

foreach (TSource item in source)
{
if (predicate(item))
{
list.Add(selector(item));
builder.Add(selector(item));
}
}

return list;
List<TResult> result = builder.ToList();
builder.Dispose();

return result;
}

public override TResult? TryGetFirst(out bool found) => TryGetFirst(_source, _predicate, _selector, out found);
Expand Down Expand Up @@ -538,19 +550,23 @@ public override TResult[] ToArray()

public override List<TResult> ToList()
{
var list = new List<TResult>();
SegmentedArrayBuilder<TResult>.ScratchBuffer scratch = default;
SegmentedArrayBuilder<TResult> builder = new(scratch);

Func<TSource, bool> predicate = _predicate;
Func<TSource, TResult> selector = _selector;
foreach (TSource item in _source)
{
if (predicate(item))
{
list.Add(selector(item));
builder.Add(selector(item));
}
}

return list;
List<TResult> result = builder.ToList();
builder.Dispose();

return result;
}

public override TResult? TryGetFirst(out bool found)
Expand Down