File: System\Linq\DefaultIfEmpty.SpeedOpt.cs
Web Access
Project: src\src\libraries\System.Linq\src\System.Linq.csproj (System.Linq)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections;
using System.Collections.Generic;
 
namespace System.Linq
{
    public static partial class Enumerable
    {
        private sealed partial class DefaultIfEmptyIterator<TSource>
        {
            public override TSource[] ToArray()
            {
                TSource[] array = _source.ToArray();
                return array.Length == 0 ? [_default] : array;
            }
 
            public override List<TSource> ToList()
            {
                List<TSource> list = _source.ToList();
                if (list.Count == 0)
                {
                    list.Add(_default);
                }
 
                return list;
            }
 
            public override int GetCount(bool onlyIfCheap)
            {
                int count;
                if (!onlyIfCheap || _source is ICollection<TSource> || _source is ICollection)
                {
                    count = _source.Count();
                }
                else
                {
                    count = _source is Iterator<TSource> iterator ? iterator.GetCount(onlyIfCheap: true) : -1;
                }
 
                return count == 0 ? 1 : count;
            }
 
            public override TSource? TryGetFirst(out bool found)
            {
                TSource? first = _source.TryGetFirst(out found);
                if (found)
                {
                    return first;
                }
 
                found = true;
                return _default;
            }
 
            public override TSource? TryGetLast(out bool found)
            {
                TSource? last = _source.TryGetLast(out found);
                if (found)
                {
                    return last;
                }
 
                found = true;
                return _default;
            }
 
            public override TSource? TryGetElementAt(int index, out bool found)
            {
                TSource? item = _source.TryGetElementAt(index, out found);
                if (found)
                {
                    return item;
                }
 
                if (index == 0)
                {
                    found = true;
                }
 
                return _default;
            }
        }
    }
}