LINQ任何运行方法

问题描述

我下面有这个代码

string[] hexSignatureList = {"AA-BB","XX-YY"};

foreach (var hexSignature in hexSignatureList)
{
    if (IsValidMimeType(hexSignature))
        throw new ArgumentException("Invalid.");
}

如何将以上代码转换为LINQ .Any语法?

解决方法

不管看起来好像是在抛出 valid mimeTypes的事实,也许是拼写错误?我假设你知道自己在做什么。

解决方案应该简单到只使用AnyFunc<TSource,bool>谓词,然后在true上使用 throwing :>

确定序列的任何元素是否满足条件

谓词

Func<TSource,Boolean>

用于测试每个元素的条件的函数。

示例

if(hexSignatureList.Any(x => IsValidMimeType(x)))
    throw new ArgumentException("Invalid.");

或用作方法组

if(hexSignatureList.Any(IsValidMimeType))
    throw new ArgumentException("Invalid.");

或者在您的原始代码不正确的情况下,并且您想针对有效的mime类型列表进行验证。您可以使用All

确定序列的所有元素是否满足条件。

if(!hexSignatureList.All(IsValidMimeType))
    throw new ArgumentException("Invalid.");

注意:以这种方式进行投掷意味着您松开了为什么无效的上下文。

另一种方法(虽然更冗长)是使用Where,因此您可以在异常中更明确地包括验证失败:

var invalidTypes = hexSignatureList
   .Where(x => IsValidMimeType(x)) // .Where(x => !IsValidMimeType(x))
   .ToList();

if(invalidTypes.Any())
    throw new ArgumentException($"Invalid types,{string.Join(",",invalidTypes)}");