【问题标题】:C#, "?" and ":" operatorsC#, ”?”和“:”运算符
【发布时间】:2018-08-26 18:59:57
【问题描述】:

我没有为我的问题找到任何解决方案,所以我问,当我有多个声明时,?: 运算符如何工作?

我想做的是,我在中间有像素pixel[pos] 和周围的像素,它看起来像:

0 0 0
0 x 0
0 0 0

x 是一个中心像素。

我正在检查它周围是否有任何白色 (zero) 像素。如果有人,我将像素标记为two。如果不是,那么模式看起来像:

1 1 1
1 x 1
1 1 1

1 是黑色像素,我将其设置为one

现在,代码:

if(pixels[positionOfPixel] == one && x > 0 && x < width 
                                  && y > 0 && y < height)
{
    pixels[positionOfPixel] = pixels[positionOfPixel - 1]          == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel + 1]          == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel - offset]     == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel + offset]     == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel - offset + 1] == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel + offset - 1] == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel - offset - 1] == zero ? two :
    pixels[positionOfPixel] = pixels[positionOfPixel - offset + 1] == zero ? two : zero;
}

我的问题是,为什么每个 one 像素都标记为 two ?为什么它没有识别像素,每个像素都是one(就像第二个模式一样)?

感谢您的任何建议!

【问题讨论】:

  • 你真正的问题是什么?
  • a?b:c 是具有 3 个操作数的 1 个运算符。
  • 并且指导原则是谨慎使用它而不是嵌套它。您将其嵌套 8 次,并嵌入了作业以增加不可读性。这不是一个好的编码方式。
  • 三元在这里是正确的选择吗?您甚至对自己的代码都进行了混淆。我认为您的实现不会因传统的if 语句而受到太大影响

标签: c# image lockbits


【解决方案1】:

我不是 C# 专家,但有一个共同的规则如何? : 可以使用运算符。

x = (boolean condition) ? reult_if_true : result_if_false;

例如

drink = isThisPersonAGirl ? wine : beer;

如果你想使用很多条件? : 操作员,你应该这样做:

x = (boolean condition 1) ? result_if_true : (boolean condition 2) ? result_if_bool_2_is_true : result_if false;

例如

drink = isThisPersonAChild ? lemonade : isThisPersonAGitl ? wine : beer

在您的代码 sn-p 中,很难理解发生了什么,因为您经常使用 = 运算符。在大多数语言中,您可以像这样初始化几个变量:

a = b = c = 0,所以a, b, c = 0;

所以我认为你的错误是过于频繁地使用 = 运算符,所以也许只有这个条件才重要,而其他条件则被简单地跳过:

pixels[positionOfPixel - offset + 1] == zero ? two : zero;

抱歉没有用,因为我真的不是 C# 编码器)

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 2016-02-19
    • 2012-02-05
    • 2012-07-27
    • 1970-01-01
    • 2011-02-13
    • 2015-09-18
    • 2012-07-16
    相关资源
    最近更新 更多