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 1 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.
  • 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
                                        • A AspDotNetDev

                                          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 Offline
                                          C Offline
                                          Cesar de Souza
                                          wrote on last edited by
                                          #38

                                          I've found GOTO support specially useful when porting code from FORTRAN - or even from C. I guess this is one of the real excuses for having a GOTO instruction in C#: dealing with legacy code from languages were GOTO are/were common place. It just becomes much easier to port entire algorithms without having to change its structure in the process. Once an initial port is complete, it is much simpler to remove those offending instructions one by one (specially after you have set lots of regression tests). However, in some cases, removing all gotos just isn't worth the risk.

                                          Interested in Machine Learning in .NET? Check the Accord.NET Framework. See also Handwriting Recognition Revisited: Kernel Support Vector Machines

                                          modified on Saturday, September 11, 2010 9:19 PM

                                          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