我正在尝试确定生成的文本文件上的错误消息是否包含单词“ 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,而第二个则不应该。但是据我所知,两者都返回了真。
答案 0 :(得分:5)
让我们解决您的问题:
multi
是string
。.Any()
是其中一种)在IEnumerable<>
上运行。IEnumerable<char>
,因此.Any()
将对此进行运算。Contains()
方法将接受string
或char
。那是怎么回事?您正在检查multi
(即m
,u
,l
,t
,{{1 }},i
,p
,l
)在字符串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
,因为如果前面两个条件都为假,则仅存在一种可能性。