如何对长 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>
时检查项目。
有没有类似的
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>
时检查项目。