将方法转换为 LINQ lambda 表达式

esa*_*ain 1 c# linq lambda .net-6.0

我有一个验证函数,它接收两个字符串并进行计数比较,如果字符串大小相同,则它检查第一个字符串中的可见字符是否与第二个字符串相同。

private bool ValidateEncryptedText(string encrypted, string plain)
{
    if (plain.Count() != encrypted.Count())
        return false;
    else
    {
        for (int index = 0; index < plain.Count(); index++)
        {
            if (plain[index] != '*' && plain[index] != encrypted[index])
                return false;
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

使用string.Length代替Count(),并使用Zip来比较对,投影到值元组以避免创建大量对象:

private bool ValidateEncryptedText(string encrypted, string plain) =>
    plain.Length == encrypted.Length &&
    plain.Zip(encrypted, (p, e) => ((p, e)))
         .All(pair => pair.p == '*' || pair.p == pair.e);
Run Code Online (Sandbox Code Playgroud)

请注意,通过使用All而不是计算失败次数,我们可以在发现差异后立即返回。(在我看来,这也使意图更加清晰。)

我要指出的是,这里的变量名称可能会产生误导 - 明文和加密文本相同确实很奇怪。