C# - boolean和if语句

时间:2017-07-04 15:38:25

标签: c#

我目前正在使用Visual Studio上的Google API Vision编写分析图像的代码。 但是我在循环期间遇到了一个问题。 分析返回一个注释列表(汽车,车辆,陆地车辆等),我想用“if”过滤它,所以我写了这个:

var image = Google.Cloud.Vision.V1.Image.FromFile("C:\\temp\\sequence\\1.jpg");
var client = ImageAnnotatorClient.Create();
var response = client.DetectLabels(image);
CropHintsAnnotation confidence = client.DetectCropHints(image);
bool empty = false;

foreach (var annotation in response)
{
    textBox1.Text += annotation.Description + "\r\n";
    textBox1.Text += "Score : " + annotation.Score + "\r\n";
    if (annotation.Description.Equals("vehicle"))
    {
        empty = false;
    }
    else
    {
        empty = true;
    }

}
textBox1.Text += "\r\nEmpty ?       " + empty + "\r\n\r\n";

所以,如果我写得好,它应该说“空?假”,因为分析返回“车辆”一次。 我还试图替换:

annotation.Description.Equals("vehicle")

通过

annotation.Description.Contains("vehicle") == true

但是没办法,它仍然说“空?真”,因为它不应该。

有什么想法吗?

提前感谢您阅读本文并寻求帮助!

3 个答案:

答案 0 :(得分:2)

不完全确定您在此处尝试做什么,但假设response有多个项目,empty变量将仅代表最后一项的值。

原因是,当循环的每次迭代到达if语句时,它将输入它或else并且肯定会输入其中一个,因此对于每次迭代,值将分配empty并覆盖之前的值

至于代码本身,以这种方式写它是更简洁的:

empty = !annotation.Description.Equals("vehicle");

你应该改变的是将分配线移动到循环中:

foreach(/*...*/)
{
    /*...*/
    empty = !annotation.Description.Equals("vehicle");
    textBox1.Text += "\r\nEmpty ?       " + empty + "\r\n\r\n";
}

答案 1 :(得分:1)

您是否考虑过返回字符串的情况?试着忽略这个案子:

annotation.Description.Equals("vehicle", StringComparison.InvariantCultureIgnoreCase)

只是旁注:Equals函数返回Boolean,因此您可以删除整个if语句并将代码简化为:

empty = !annotation.Description.Equals("vehicle", StringComparison.InvariantCultureIgnoreCase)

答案 2 :(得分:0)

几种可能性:

  1. 你能检查一下车辆的顺序。也可能是它确实在索引0上找到车辆的描述,但是索引1不是车辆,因此它会覆盖先前的值。如果是这种情况,您可能希望在满足所需条件时退出循环。

    foreach (var annotation in response)
    {
        // not sure if you want this to 
        textBox1.Text += annotation.Description + "\r\n";
        textBox1.Text += "Score : " + annotation.Score + "\r\n";
        if (annotation.Description.Equals("vehicle",  
        StringComparison.InvariantCultureIgnoreCase))
        {
            empty = false;
            textBox1.Text += "\r\nEmpty ?       " + empty + "\r\n\r\n";
            //possibly also break if you've achieved what you want.
            break;
        }
    }