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. I love Tuples

I love Tuples

Scheduled Pinned Locked Moved The Lounge
csharp
15 Posts 12 Posters 4 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.
  • B Offline
    B Offline
    Behzad Sedighzadeh
    wrote on last edited by
    #1

    IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

    Behzad

    G M P T Sander RosselS 7 Replies Last reply
    0
    • B Behzad Sedighzadeh

      IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

      Behzad

      G Offline
      G Offline
      GKP1992
      wrote on last edited by
      #2

      Behzad Sedighzadeh wrote:

      It helps make code cleaner and quicker to write

      Quicker to write, Okay! Cleaner? I don't think so. Create a nested tuple and now you don't know which element you are referring to when you say Item2. It makes code difficult to maintain. So for simple return types that has like 2 or 3 primitive data types tuple is fine, otherwise just create a class.

      M 1 Reply Last reply
      0
      • B Behzad Sedighzadeh

        IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

        Behzad

        M Offline
        M Offline
        Marc Clifton
        wrote on last edited by
        #3

        Yes, tuples are great, especially as a replacement for out string foo and I use them primarily for returning multiple things for rather low level methods when out or a C# class/struct is just overkill. The fact that the tuple parameters can be named was a huge advancement, rather than having to use Item1, Item2, etc. That said, I use them judiciously and always ask myself, if I'm using a tuple here, is that the right approach or am I compensating for a possibly bad "design." For example (this from code I have in a library):

            public (HttpStatusCode status, string content) Get(string url, Dictionary headers = null)
            {
                var client = RestClientFactory();
                var request = new RestRequest(url, Method.Get);
        
                headers?.ForEach(kvp => request.AddHeader(kvp.Key, kvp.Value));
                RestResponse response = client.Execute(request);
        
                return (response.StatusCode, response.Content);
            }
        

        Why am I parsing out the status code and content instead of just returning the response object? One answer is that returning response may probably require a using RestSharp and even a reference to the RestSharp package in the caller project. OK, maybe that's a defensible argument, maybe not. After using this library of mine (REST is just one small part of this library) I'm not that thrilled with my initial wrapper implementation. But because I started this "pattern", it continues, like:

            public (T item, HttpStatusCode status, string content) Get(string url, Dictionary headers = null) where T : new()
            {
                var client = RestClientFactory();
                var request = new RestRequest(url, Method.Get);
        
                headers?.ForEach(kvp => request.AddHeader(kvp.Key, kvp.Value));
                RestResponse response = client.Execute(request);
                T ret = TryDeserialize(response);
        
                return (ret, response.StatusCode, response.Content);
            }
        

        And this illustrates mashing together various potentially bad implementation/designs. The tuple now returns three things, and the TryDeserialize catches exceptions silently, returning a null for T item, and what if I want the actual deserialization exception? And now that I look at that code again after a couple years, what's with that AddHeader loop when there's a perfectly

        Richard Andrew x64R 1 Reply Last reply
        0
        • G GKP1992

          Behzad Sedighzadeh wrote:

          It helps make code cleaner and quicker to write

          Quicker to write, Okay! Cleaner? I don't think so. Create a nested tuple and now you don't know which element you are referring to when you say Item2. It makes code difficult to maintain. So for simple return types that has like 2 or 3 primitive data types tuple is fine, otherwise just create a class.

          M Offline
          M Offline
          Marc Clifton
          wrote on last edited by
          #4

          GKP1992 wrote:

          Create a nested tuple and now you don't know which element you are referring to when you say Item2

          Tuple "items" can be named, so: var name = GetMyName(); where:

          (string firstName, string lastName) GetMyName()
          {
          return ("Marc", "Clifton");
          }

          I can use name.firstName and name.lastName Most of the time. ;)

          Latest Articles:
          A Lightweight Thread Safe In-Memory Keyed Generic Cache Collection Service A Dynamic Where Implementation for Entity Framework

          P R R 3 Replies Last reply
          0
          • M Marc Clifton

            GKP1992 wrote:

            Create a nested tuple and now you don't know which element you are referring to when you say Item2

            Tuple "items" can be named, so: var name = GetMyName(); where:

            (string firstName, string lastName) GetMyName()
            {
            return ("Marc", "Clifton");
            }

            I can use name.firstName and name.lastName Most of the time. ;)

            Latest Articles:
            A Lightweight Thread Safe In-Memory Keyed Generic Cache Collection Service A Dynamic Where Implementation for Entity Framework

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

            But is that C#?

            H 1 Reply Last reply
            0
            • P PIEBALDconsult

              But is that C#?

              H Offline
              H Offline
              honey the codewitch
              wrote on last edited by
              #6

              Yes

              Check out my IoT graphics library here: https://honeythecodewitch.com/gfx And my IoT UI/User Experience library here: https://honeythecodewitch.com/uix

              1 Reply Last reply
              0
              • B Behzad Sedighzadeh

                IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

                Behzad

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

                I don't use them much. I usually prefer to create a class. It kinda depends on how important the thing is.

                1 Reply Last reply
                0
                • M Marc Clifton

                  Yes, tuples are great, especially as a replacement for out string foo and I use them primarily for returning multiple things for rather low level methods when out or a C# class/struct is just overkill. The fact that the tuple parameters can be named was a huge advancement, rather than having to use Item1, Item2, etc. That said, I use them judiciously and always ask myself, if I'm using a tuple here, is that the right approach or am I compensating for a possibly bad "design." For example (this from code I have in a library):

                      public (HttpStatusCode status, string content) Get(string url, Dictionary headers = null)
                      {
                          var client = RestClientFactory();
                          var request = new RestRequest(url, Method.Get);
                  
                          headers?.ForEach(kvp => request.AddHeader(kvp.Key, kvp.Value));
                          RestResponse response = client.Execute(request);
                  
                          return (response.StatusCode, response.Content);
                      }
                  

                  Why am I parsing out the status code and content instead of just returning the response object? One answer is that returning response may probably require a using RestSharp and even a reference to the RestSharp package in the caller project. OK, maybe that's a defensible argument, maybe not. After using this library of mine (REST is just one small part of this library) I'm not that thrilled with my initial wrapper implementation. But because I started this "pattern", it continues, like:

                      public (T item, HttpStatusCode status, string content) Get(string url, Dictionary headers = null) where T : new()
                      {
                          var client = RestClientFactory();
                          var request = new RestRequest(url, Method.Get);
                  
                          headers?.ForEach(kvp => request.AddHeader(kvp.Key, kvp.Value));
                          RestResponse response = client.Execute(request);
                          T ret = TryDeserialize(response);
                  
                          return (ret, response.StatusCode, response.Content);
                      }
                  

                  And this illustrates mashing together various potentially bad implementation/designs. The tuple now returns three things, and the TryDeserialize catches exceptions silently, returning a null for T item, and what if I want the actual deserialization exception? And now that I look at that code again after a couple years, what's with that AddHeader loop when there's a perfectly

                  Richard Andrew x64R Offline
                  Richard Andrew x64R Offline
                  Richard Andrew x64
                  wrote on last edited by
                  #8

                  :-D I think there are very few people smarter than you.

                  The difficult we do right away... ...the impossible takes slightly longer.

                  1 Reply Last reply
                  0
                  • B Behzad Sedighzadeh

                    IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

                    Behzad

                    T Offline
                    T Offline
                    TNCaver
                    wrote on last edited by
                    #9

                    I love them because sometimes it is convenient to return more than one value from a method, and the use case doesn't justify the overhead of creating and populating a POCO.

                    There are no solutions, only trade-offs.
                       - Thomas Sowell

                    A day can really slip by when you're deliberately avoiding what you're supposed to do.
                       - Calvin (Bill Watterson, Calvin & Hobbes)

                    1 Reply Last reply
                    0
                    • B Behzad Sedighzadeh

                      IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

                      Behzad

                      Sander RosselS Offline
                      Sander RosselS Offline
                      Sander Rossel
                      wrote on last edited by
                      #10

                      Tuples and anonymous classes have drastically reduced the number of single-use classes in my code :D

                      Best, Sander Azure DevOps Succinctly (free eBook) Azure Serverless Succinctly (free eBook) Migrating Apps to the Cloud with Azure arrgh.js - Bringing LINQ to JavaScript

                      B 1 Reply Last reply
                      0
                      • M Marc Clifton

                        GKP1992 wrote:

                        Create a nested tuple and now you don't know which element you are referring to when you say Item2

                        Tuple "items" can be named, so: var name = GetMyName(); where:

                        (string firstName, string lastName) GetMyName()
                        {
                        return ("Marc", "Clifton");
                        }

                        I can use name.firstName and name.lastName Most of the time. ;)

                        Latest Articles:
                        A Lightweight Thread Safe In-Memory Keyed Generic Cache Collection Service A Dynamic Where Implementation for Entity Framework

                        R Offline
                        R Offline
                        Rob Philpott
                        wrote on last edited by
                        #11

                        The slightly weird thing that disturbs me about that is that firstName and lastName behave/look a lot like members of a class/struct yet don't have Pascal Case naming. name.firstName vs. name.FirstName It reminds me of Javascript, and well you know what that can inflict on the soul.

                        Regards, Rob Philpott.

                        1 Reply Last reply
                        0
                        • M Marc Clifton

                          GKP1992 wrote:

                          Create a nested tuple and now you don't know which element you are referring to when you say Item2

                          Tuple "items" can be named, so: var name = GetMyName(); where:

                          (string firstName, string lastName) GetMyName()
                          {
                          return ("Marc", "Clifton");
                          }

                          I can use name.firstName and name.lastName Most of the time. ;)

                          Latest Articles:
                          A Lightweight Thread Safe In-Memory Keyed Generic Cache Collection Service A Dynamic Where Implementation for Entity Framework

                          R Offline
                          R Offline
                          raddevus
                          wrote on last edited by
                          #12

                          Nice example. I fired up C# Repl and tried it out. :thumbsup:

                          1 Reply Last reply
                          0
                          • B Behzad Sedighzadeh

                            IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

                            Behzad

                            J Offline
                            J Offline
                            Jeremy Falcon
                            wrote on last edited by
                            #13

                            I don't use C# much these days but totally agree. And, digging the positivity man. :cool:

                            Jeremy Falcon

                            1 Reply Last reply
                            0
                            • B Behzad Sedighzadeh

                              IMHO, in recent years, the best feature MS has added to the C# is Tuple. It helps make code cleaner and quicker to write. It can be compared to Generic lists.

                              Behzad

                              D Offline
                              D Offline
                              Daniel Pfeffer
                              wrote on last edited by
                              #14

                              Like (almost) everything in C#, they have their uses. Loving them? No!

                              Freedom is the freedom to say that two plus two make four. If that is granted, all else follows. -- 6079 Smith W.

                              1 Reply Last reply
                              0
                              • Sander RosselS Sander Rossel

                                Tuples and anonymous classes have drastically reduced the number of single-use classes in my code :D

                                Best, Sander Azure DevOps Succinctly (free eBook) Azure Serverless Succinctly (free eBook) Migrating Apps to the Cloud with Azure arrgh.js - Bringing LINQ to JavaScript

                                B Offline
                                B Offline
                                Behzad Sedighzadeh
                                wrote on last edited by
                                #15

                                100% agreed!

                                Behzad

                                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