如何对长 LINQ 链中可枚举的每一项进行断言

How to assert something about every item in enumerable in a long LINQ chain

有没有类似的

myList.Select(..).Where(...).Assert(x=>x.Length<2).Select(...)...

如果有任何项目不满足条件,哪个会抛出,否则会像 .Select(x=>x) 一样?

您可以自己轻松编写此扩展。假设您有一个例外,比如说,AssertionFailedException,像这样的事情就可以解决问题。

public static IEnumerable<T> Assert<T>(this IEnumerable<T> items, Func<T, bool> expression)
{
    foreach(var item in items)
    {
          if(!expression(item))
                throw new AssertionFailedException();
          yield return item;
    }
}

没有内置的东西,但是很容易写一些东西:

public static class EnumerableExtensions
{
    public static IEnumerable<T> Assert<T>(this IEnumerable<T> input, Func<T, bool> condition)
    {
        if (input is null)
            throw new ArgumentNullException(nameof(input));
        if (condition is null)
            throw new ArgumentNullException(nameof(condition));

        return Impl();

        IEnumerable<T> Impl()
        {
            foreach (var item in input)
            {
                if (!condition(item))
                    throw new AssertionFailedException(...);
                yield return item;
            }
        }
    }
}

请注意,当然,这只会在枚举 returns 的 IEnumerable<T> 时检查项目。