CodeLiturgy.Dashboard/BlueWest.Collections/IEnumerableExtensions.cs

57 lines
1.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
namespace BlueWest.Collections
{
public static class IEnumerableExtensions
{
public static TSource? FirstOrNull<TSource>(this TSource[] source, Func<TSource, bool> predicate) where TSource : struct =>
source.TryGetFirst(predicate);
private static TSource? TryGetFirst<TSource>(this TSource[] source, Func<TSource, bool> predicate) where TSource : struct
{
for (var i = 0; i < source.Length; i++)
{
if (predicate(source[i]))
{
return source[i];
}
}
return null;
}
public static TSource FirstOrNullRef<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) where TSource : class =>
source.TryGetFirstClass(predicate);
public static TSource? FirstOrNullStruct<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) where TSource : struct =>
source.TryGetFirstStruct(predicate);
private static TSource? TryGetFirstStruct<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) where TSource : struct
{
foreach (TSource obj in source)
{
if (predicate(obj))
{
return obj;
}
}
return null;
}
private static TSource TryGetFirstClass<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) where TSource : class
{
foreach (TSource obj in source)
{
if (predicate(obj))
{
return obj;
}
}
return null;
}
}
}