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

时间:2019-06-28 02:26:36

标签: 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");
            }

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

1 个答案:

答案 0 :(得分:5)

让我们解决您的问题:

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

那是怎么回事?您正在检查multi(即mult,{{1 }},ipl)在字符串e中找到。

您实际想要写的只是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"); } (尤其是在较大的文件上),而是先进行以下计算:

sheet.Contains

正如@Kristianne Nerona所述,您可以将最后一个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"); } 更改为else if,因为如果前面两个条件都为假,则仅存在一种可能性。