问题描述
我下面有这个代码
string[] hexSignatureList = {"AA-BB","XX-YY"};
foreach (var hexSignature in hexSignatureList)
{
if (IsValidMimeType(hexSignature))
throw new ArgumentException("Invalid.");
}
如何将以上代码转换为LINQ .Any
语法?
解决方法
不管看起来好像是在抛出 valid mimeTypes的事实,也许是拼写错误?我假设你知道自己在做什么。
解决方案应该简单到只使用Any
的Func<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)}");