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 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.
  • 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 Online
            Richard Andrew x64R Online
            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