如何修复无论如何在If语句中似乎返回true的Any方法

Off*_*arc -1 c#

我正在尝试确定生成的文本文件上的错误消息是否包含单词“ multiple”,“ Database”或两者。对于每个文本文件,我正在评估它包含的单词,而现在仅使用消息传递框查看其评估方式。从我可以看出,第一个if语句是唯一返回true的语句,即使我在文件夹中拥有的两个文本.txt文件每个都只有一个关键字。下面的代码。

我搜索了是否在else if语句中的感叹号位置错误,但是从我发现的情况来看,它看起来是正确的。

string[] files = Directory.GetFiles(@"C:\temp\test", "*.txt");

        var multi = "multiple";
        var data = "Database";

        for (int i = 0; i < files.Length; i++)
        {
            var sheet = File.ReadAllText(files[i]);

            if (multi.Any(sheet.Contains) && data.Any(sheet.Contains))
            {
                MessageBox.Show("Both");
            }
            else if (multi.Any(sheet.Contains) && !data.Any(sheet.Contains))
            {
                MessageBox.Show("Just Multiple");

            }else if(!multi.Any(sheet.Contains) && data.Any(sheet.Contains))
            {
                MessageBox.Show("Just Database");
            }
Run Code Online (Sandbox Code Playgroud)

因此,第一个文件中只有单词“ multiple”。第一个if语句应该返回false,因为两个条件都不满足,因为第一个any方法返回true,而第二个则不应该。但是据我所知,两者都返回了真实。

Joh*_*ica 5

让我们分解您的问题:

  • multi是一个string
  • LINQ扩展方法(其中.Any()之一)在上运行IEnumerable<>
  • 字符串的可枚举是IEnumerable<char>,因此.Any()将对此进行运算。
  • 字符串Contains()方法将接受a string或a char

那是怎么回事?如果要检查所有的字符multi(即multiple)的字符串中找到sheet

您实际要写的只是if (sheet.contains(multiple)),等等。

修复您的当前代码,它应如下所示:

if (sheet.Contains(multi) && sheet.Contains(data))
{
    MessageBox.Show("Both");
}
else if (sheet.Contains(multi) && !sheet.Contains(data))
{
    MessageBox.Show("Just Multiple");

}
else if(!sheet.Contains(multi) && sheet.Contains(data))
{
    MessageBox.Show("Just Database");
}
Run Code Online (Sandbox Code Playgroud)

尽管我可能会避免sheet.Contains一遍又一遍(尤其是在较大的文件上),而是先进行这些计算:

bool containsMulti = sheet.Contains(multi);
bool containsData = sheet.Contains(data);

if (containsMulti && containsData)
{
    MessageBox.Show("Both");
}
else if (containsMulti && !containsData)
{
    MessageBox.Show("Just Multiple");
}
else if (!containsMulti && containsData)
{
    MessageBox.Show("Just Database");
}
Run Code Online (Sandbox Code Playgroud)

就像@Kristianne Nerona指出的那样,您可以将最后else if一个简单地更改为an else,因为如果前面的两个条件都为假,则仅存在一种可能性。