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 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