Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. You'll be glad to know! [modified]

You'll be glad to know! [modified]

Scheduled Pinned Locked Moved The Lounge
csharpcsscomalgorithmsperformance
73 Posts 17 Posters 3 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Luc Pattyn

    You really should read part 2 of your Language Reference Manual, in particular the chapters on logical operators and short-circuitry.

    for (...) {
    if (calculation()==someValue || someOtherCalculation()==someValue2) localVar.UpdateNicely();
    }

    Readability is the key concern here. :)

    Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

    Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

    A Offline
    A Offline
    AspDotNetDev
    wrote on last edited by
    #18

    Dang, you beat me.

    [Forum Guidelines]

    L 1 Reply Last reply
    0
    • P Peter_in_2780

      How about

      for(...)
      {
      avar = calculation()
      if(avar != someValue)
      {
      avar2 = someOtherCalculation();
      if(avar2 != someValue2)
      continue;
      }
      localVar.UpdateNicely();
      }

      The point is basically that

      if (something)
      goto somewhere
      more_stuff;
      somewhere:

      is equivalent to

      if (!something)
      more_stuff;

      and you've just got two of them nested. Cheers from one who thinks coding standards are generally a good thing but do not represent ultimate authority. Peter

      Software rusts. Simon Stephenson, ca 1994.

      S Offline
      S Offline
      Super Lloyd
      wrote on last edited by
      #19

      Indeed that will do! :thumbsup: :) However.... I do prefer goto to multiple nested statement! ;P

      A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

      D P 2 Replies Last reply
      0
      • A AspDotNetDev

        Dang, you beat me.

        [Forum Guidelines]

        L Offline
        L Offline
        Luc Pattyn
        wrote on last edited by
        #20

        the advantage of a keyboard with a very short cable. :)

        Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

        Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

        1 Reply Last reply
        0
        • S Super Lloyd

          Indeed that will do! :thumbsup: :) However.... I do prefer goto to multiple nested statement! ;P

          A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

          D Offline
          D Offline
          Dalek Dave
          wrote on last edited by
          #21

          It's neater.

          ------------------------------------ I will never again mention that I was the poster of the One Millionth Lounge Post, nor that it was complete drivel. Dalek Dave CCC League Table Link CCC Link[^]

          S 1 Reply Last reply
          0
          • L Luc Pattyn

            You really should read part 2 of your Language Reference Manual, in particular the chapters on logical operators and short-circuitry.

            for (...) {
            if (calculation()==someValue || someOtherCalculation()==someValue2) localVar.UpdateNicely();
            }

            Readability is the key concern here. :)

            Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

            Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

            S Offline
            S Offline
            Super Lloyd
            wrote on last edited by
            #22

            there is the matter of avoiding goto, but this is no big deal, the real challenge is to do it in aesthetic and readable way! Well, I guess it's a subjective matter... But just to give you better chance, here is the real code. I think goto is the most elegant / beautiful solution. I invite you to show me the beauty of avoiding goto! (Although.. being a subjective thing... well....) Here we go:

            for (int i = max; i >= min; i--)
            {
            var v1 = new Vector2D(points[i > 0 ? i - 1 : points.Count - 1], points[i]);
            var v2 = new Vector2D(points[i], points[i < points.Count - 1 ? i + 1 : 0]);
            if (v1.SquareNorm <= MINL || v2.SquareNorm <= MINL)
            goto RemovePoint;
            v1 = v1.Normalize(); // divide by zero if test above fail
            v2 = v2.Normalize();
            var z = v1 ^ v2;
            if (Math.Abs(z) <= minsin && v1 * v2 < 0)
            goto RemovePoint;
            continue;
            RemovePoint: ;
            points.RemoveAt(i);
            if (points.Count < 3)
            return null;
            }

            A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

            modified on Thursday, September 9, 2010 8:31 PM

            A 1 Reply Last reply
            0
            • S Super Lloyd

              Yesterday I wrote no less than 2 gotos in my C# code! [Edit2] This guy[^] found a satisfying refactoring! One which doesn't tax my (limited brain) memory with nested block, additional variable, additional test, increased cyclomatic complexity! (In fact the cyclomatic complexity is reduced by 1, I think) Well done! :thumbsup: :cool: :-D [EDIT] For your information the real code is below. So far no one has come up with a non goto version which can beat the goto version on any of those 4 criteria: - number of line of code (less) - number of if (less) - number of nested block (less) - number of variables (less) -- code --

              for (int i = max; i >= min; i--)
              {
              var v1 = new Vector2D(points[i > 0 ? i - 1 : points.Count - 1], points[i]);
              var v2 = new Vector2D(points[i], points[i < points.Count - 1 ? i + 1 : 0]);
              if (v1.SquareNorm <= MINL || v2.SquareNorm <= MINL)
              goto RemovePoint;
              v1 = v1.Normalize(); // divide by zero if square norm is 0 (test above)
              v2 = v2.Normalize();
              var z = v1 ^ v2;
              if (Math.Abs(z) <= minsin && v1 * v2 < 0)
              goto RemovePoint;
              continue;
              RemovePoint: ;
              points.RemoveAt(i);
              if (points.Count < 3)
              return null;
              }

              A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

              modified on Friday, September 10, 2010 10:53 AM

              A Offline
              A Offline
              AspDotNetDev
              wrote on last edited by
              #23

              The only acceptable place I've found for a goto is within a switch block. After all, the "labels" are already defined.

              [Forum Guidelines]

              C 1 Reply Last reply
              0
              • S Super Lloyd

                Yesterday I wrote no less than 2 gotos in my C# code! [Edit2] This guy[^] found a satisfying refactoring! One which doesn't tax my (limited brain) memory with nested block, additional variable, additional test, increased cyclomatic complexity! (In fact the cyclomatic complexity is reduced by 1, I think) Well done! :thumbsup: :cool: :-D [EDIT] For your information the real code is below. So far no one has come up with a non goto version which can beat the goto version on any of those 4 criteria: - number of line of code (less) - number of if (less) - number of nested block (less) - number of variables (less) -- code --

                for (int i = max; i >= min; i--)
                {
                var v1 = new Vector2D(points[i > 0 ? i - 1 : points.Count - 1], points[i]);
                var v2 = new Vector2D(points[i], points[i < points.Count - 1 ? i + 1 : 0]);
                if (v1.SquareNorm <= MINL || v2.SquareNorm <= MINL)
                goto RemovePoint;
                v1 = v1.Normalize(); // divide by zero if square norm is 0 (test above)
                v2 = v2.Normalize();
                var z = v1 ^ v2;
                if (Math.Abs(z) <= minsin && v1 * v2 < 0)
                goto RemovePoint;
                continue;
                RemovePoint: ;
                points.RemoveAt(i);
                if (points.Count < 3)
                return null;
                }

                A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                modified on Friday, September 10, 2010 10:53 AM

                P Offline
                P Offline
                PIEBALDconsult
                wrote on last edited by
                #24

                Until I did some refactoring today I had a method with three return statements! :omg: (They were to avoid a goto to abort a nested loop.)

                A S 2 Replies Last reply
                0
                • S Super Lloyd

                  well, I wanted to use some simple pseudo code, but the statement "var1 = calculation()" is really a multi inner variable multiline statement with a more complex statement. I guess I can replace it with a private static variable with heaps of ref variable just or the sake of writing such statement as you sugest, but I won't!

                  A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                  L Offline
                  L Offline
                  Luc Pattyn
                  wrote on last edited by
                  #25

                  Well, the complexity of avar1 = someCalculation(); isn't relevant, you can do it upfront anyway. The complexity of avar2 = someOtherCalculation(); is what matters. If it can't be put in the middle of the if clause, I'd use a boolean flag, like so:

                  for (...) {
                  bool updateWanted=false;
                  if (calculation()==someValue) updateWanted=true;
                  else if (someOtherCalculation()==someValue2) updateWanted=true;
                  if (updateWanted) localVar.UpdateNicely();
                  }

                  and now you can easily expand line 4 (and 3) as required. :)

                  Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                  Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                  modified on Thursday, September 9, 2010 8:52 PM

                  S 2 Replies Last reply
                  0
                  • P PIEBALDconsult

                    Until I did some refactoring today I had a method with three return statements! :omg: (They were to avoid a goto to abort a nested loop.)

                    A Offline
                    A Offline
                    AspDotNetDev
                    wrote on last edited by
                    #26

                    PIEBALDconsult wrote:

                    avoid a goto to abort a nested loop

                    I usually set some bool, break, then conditionally break depending on the value in the bool. Slows things down a bit, so a goto might be more acceptable in this case if speed is of significant importance and the inner loop does not have many iterations.

                    [Forum Guidelines]

                    1 Reply Last reply
                    0
                    • D Dalek Dave

                      That's actually a nice bit of code. I have much to learm :sigh:

                      ------------------------------------ I will never again mention that I was the poster of the One Millionth Lounge Post, nor that it was complete drivel. Dalek Dave CCC League Table Link CCC Link[^]

                      L Offline
                      L Offline
                      Luc Pattyn
                      wrote on last edited by
                      #27

                      it's like writing poetry, just keep scrapping the redundant bits until you start to like the result. Except you have to adhere to the original intentions... :)

                      Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                      Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                      1 Reply Last reply
                      0
                      • L Luc Pattyn

                        Well, the complexity of avar1 = someCalculation(); isn't relevant, you can do it upfront anyway. The complexity of avar2 = someOtherCalculation(); is what matters. If it can't be put in the middle of the if clause, I'd use a boolean flag, like so:

                        for (...) {
                        bool updateWanted=false;
                        if (calculation()==someValue) updateWanted=true;
                        else if (someOtherCalculation()==someValue2) updateWanted=true;
                        if (updateWanted) localVar.UpdateNicely();
                        }

                        and now you can easily expand line 4 (and 3) as required. :)

                        Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                        Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                        modified on Thursday, September 9, 2010 8:52 PM

                        S Offline
                        S Offline
                        Super Lloyd
                        wrote on last edited by
                        #28

                        see the code below! it can't be done upfront, as the first if will avoid as divide by zero in the second if! just for your benefit I post the code below again! Anyway, yes it can be done, but I found my way more readable... I guess it's too subjective for debate.. but I invite you to show me the new version:

                        for (int i = max; i >= min; i--)
                        {
                        var v1 = new Vector2D(points[i > 0 ? i - 1 : points.Count - 1], points[i]);
                        var v2 = new Vector2D(points[i], points[i < points.Count - 1 ? i + 1 : 0]);
                        if (v1.SquareNorm <= MINL || v2.SquareNorm <= MINL)
                        goto RemovePoint;
                        v1 = v1.Normalize(); // divide by zero if square norm is 0 (test above)
                        v2 = v2.Normalize();
                        var z = v1 ^ v2;
                        if (Math.Abs(z) <= minsin && v1 * v2 < 0)
                        goto RemovePoint;
                        continue;
                        RemovePoint: ;
                        points.RemoveAt(i);
                        if (points.Count < 3)
                        return null;
                        }

                        A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                        L Steve EcholsS 2 Replies Last reply
                        0
                        • D Dalek Dave

                          It's neater.

                          ------------------------------------ I will never again mention that I was the poster of the One Millionth Lounge Post, nor that it was complete drivel. Dalek Dave CCC League Table Link CCC Link[^]

                          S Offline
                          S Offline
                          Super Lloyd
                          wrote on last edited by
                          #29

                          Thanks! Glad someone agree! I think I was looking for a beating... but I have a hard time handling it! :laugh:

                          A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                          1 Reply Last reply
                          0
                          • S Super Lloyd

                            Indeed that will do! :thumbsup: :) However.... I do prefer goto to multiple nested statement! ;P

                            A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                            P Offline
                            P Offline
                            Peter_in_2780
                            wrote on last edited by
                            #30

                            Two comments. 1. Loops are only nested too deep when you need to indent each level by less than [insert favourite small number here, mine's 4] spaces to fit it on the screen. ;P The construct

                            if (!test)
                            goto next;
                            do_stuff;
                            next:

                            is actually what a compiler* will emit if you feed it

                            if (test)
                            do_stuff;

                            Ironic, huh? But maybe that's why we deal in the input to compilers and leave their output unseen. * for a typical target instruction set

                            Software rusts. Simon Stephenson, ca 1994.

                            S 1 Reply Last reply
                            0
                            • P PIEBALDconsult

                              Until I did some refactoring today I had a method with three return statements! :omg: (They were to avoid a goto to abort a nested loop.)

                              S Offline
                              S Offline
                              Super Lloyd
                              wrote on last edited by
                              #31

                              Ho my god! That Is Bad! :laugh:

                              A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                              1 Reply Last reply
                              0
                              • S Super Lloyd

                                there is the matter of avoiding goto, but this is no big deal, the real challenge is to do it in aesthetic and readable way! Well, I guess it's a subjective matter... But just to give you better chance, here is the real code. I think goto is the most elegant / beautiful solution. I invite you to show me the beauty of avoiding goto! (Although.. being a subjective thing... well....) Here we go:

                                for (int i = max; i >= min; i--)
                                {
                                var v1 = new Vector2D(points[i > 0 ? i - 1 : points.Count - 1], points[i]);
                                var v2 = new Vector2D(points[i], points[i < points.Count - 1 ? i + 1 : 0]);
                                if (v1.SquareNorm <= MINL || v2.SquareNorm <= MINL)
                                goto RemovePoint;
                                v1 = v1.Normalize(); // divide by zero if test above fail
                                v2 = v2.Normalize();
                                var z = v1 ^ v2;
                                if (Math.Abs(z) <= minsin && v1 * v2 < 0)
                                goto RemovePoint;
                                continue;
                                RemovePoint: ;
                                points.RemoveAt(i);
                                if (points.Count < 3)
                                return null;
                                }

                                A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                                modified on Thursday, September 9, 2010 8:31 PM

                                A Offline
                                A Offline
                                AspDotNetDev
                                wrote on last edited by
                                #32

                                If you really don't want to put some of that logic into functions, this is one way to go:

                                for(...)
                                {
                                bool doRemove = false;
                                var v1 = a();
                                var v2 = b();
                                if(v1.a() || v2.a())
                                {
                                doRemove = true;
                                }
                                else
                                {
                                v1 = c();
                                v2 = d();
                                var z = e();
                                if(e(z, v1, v2))
                                {
                                doRemove = true;
                                }
                                }
                                if(doRemove)
                                {
                                RemovePoint();
                                }
                                }

                                I put in some placeholders where I didn't feel like typing.

                                [Forum Guidelines]

                                S 1 Reply Last reply
                                0
                                • P Peter_in_2780

                                  Two comments. 1. Loops are only nested too deep when you need to indent each level by less than [insert favourite small number here, mine's 4] spaces to fit it on the screen. ;P The construct

                                  if (!test)
                                  goto next;
                                  do_stuff;
                                  next:

                                  is actually what a compiler* will emit if you feed it

                                  if (test)
                                  do_stuff;

                                  Ironic, huh? But maybe that's why we deal in the input to compilers and leave their output unseen. * for a typical target instruction set

                                  Software rusts. Simon Stephenson, ca 1994.

                                  S Offline
                                  S Offline
                                  Super Lloyd
                                  wrote on last edited by
                                  #33

                                  mmh... so you mean your way is better because it will compile to my way?!? ;P anyway, at this stage it's a matter of taste, your solution is elegant too! but too many bracket confuses me and the compiler in my brain! (as opposed to the one on the hard drive ;) )

                                  A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                                  P 1 Reply Last reply
                                  0
                                  • S Super Lloyd

                                    see the code below! it can't be done upfront, as the first if will avoid as divide by zero in the second if! just for your benefit I post the code below again! Anyway, yes it can be done, but I found my way more readable... I guess it's too subjective for debate.. but I invite you to show me the new version:

                                    for (int i = max; i >= min; i--)
                                    {
                                    var v1 = new Vector2D(points[i > 0 ? i - 1 : points.Count - 1], points[i]);
                                    var v2 = new Vector2D(points[i], points[i < points.Count - 1 ? i + 1 : 0]);
                                    if (v1.SquareNorm <= MINL || v2.SquareNorm <= MINL)
                                    goto RemovePoint;
                                    v1 = v1.Normalize(); // divide by zero if square norm is 0 (test above)
                                    v2 = v2.Normalize();
                                    var z = v1 ^ v2;
                                    if (Math.Abs(z) <= minsin && v1 * v2 < 0)
                                    goto RemovePoint;
                                    continue;
                                    RemovePoint: ;
                                    points.RemoveAt(i);
                                    if (points.Count < 3)
                                    return null;
                                    }

                                    A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                                    L Offline
                                    L Offline
                                    Luc Pattyn
                                    wrote on last edited by
                                    #34

                                    I already gave my preferred structure here[^], and I think we've had enough code in the Lounge for this week... :)

                                    Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                                    Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                                    1 Reply Last reply
                                    0
                                    • A AspDotNetDev

                                      If you really don't want to put some of that logic into functions, this is one way to go:

                                      for(...)
                                      {
                                      bool doRemove = false;
                                      var v1 = a();
                                      var v2 = b();
                                      if(v1.a() || v2.a())
                                      {
                                      doRemove = true;
                                      }
                                      else
                                      {
                                      v1 = c();
                                      v2 = d();
                                      var z = e();
                                      if(e(z, v1, v2))
                                      {
                                      doRemove = true;
                                      }
                                      }
                                      if(doRemove)
                                      {
                                      RemovePoint();
                                      }
                                      }

                                      I put in some placeholders where I didn't feel like typing.

                                      [Forum Guidelines]

                                      S Offline
                                      S Offline
                                      Super Lloyd
                                      wrote on last edited by
                                      #35

                                      ok, I guess this one will work and is readable! :thumbsup: but I still prefer my way! :laugh:

                                      A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                                      M 1 Reply Last reply
                                      0
                                      • L Luc Pattyn

                                        Well, the complexity of avar1 = someCalculation(); isn't relevant, you can do it upfront anyway. The complexity of avar2 = someOtherCalculation(); is what matters. If it can't be put in the middle of the if clause, I'd use a boolean flag, like so:

                                        for (...) {
                                        bool updateWanted=false;
                                        if (calculation()==someValue) updateWanted=true;
                                        else if (someOtherCalculation()==someValue2) updateWanted=true;
                                        if (updateWanted) localVar.UpdateNicely();
                                        }

                                        and now you can easily expand line 4 (and 3) as required. :)

                                        Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                                        Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                                        modified on Thursday, September 9, 2010 8:52 PM

                                        S Offline
                                        S Offline
                                        Super Lloyd
                                        wrote on last edited by
                                        #36

                                        mm.. I guess it's a nice simplification of other solution and it works AND is easily readable too!! :thumbsup: anyway, I still prefer my code! :laugh:

                                        A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                                        1 Reply Last reply
                                        0
                                        • S Super Lloyd

                                          mmh... so you mean your way is better because it will compile to my way?!? ;P anyway, at this stage it's a matter of taste, your solution is elegant too! but too many bracket confuses me and the compiler in my brain! (as opposed to the one on the hard drive ;) )

                                          A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.

                                          P Offline
                                          P Offline
                                          Peter_in_2780
                                          wrote on last edited by
                                          #37

                                          Super Lloyd wrote:

                                          your way is better because it will compile to my way

                                          What I am saying is that it's good for us that compilers can do the messy stuff, leaving us to express our algorithms in ways we can wrap our heads around without spewing. A couple of others have made similar comments in this thread. Enough with the philosophy! I'm outta here! ;P

                                          Software rusts. Simon Stephenson, ca 1994.

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups