2012-06-21 19 views
6

Stavo guardando esempi online di Tuple ma non vedo alcun uso ideale di esso.C# Tupla - Che cosa è un uso pratico di Tuple

Significato, sembra un posto dove memorizzare le variabili.

Esiste un uso pratico di Tuple. Quello che mi piace fare è passare un valore alla tupla e poi farlo tornare indietro di 3 valori che sono tutte stringhe.

+5

Che cosa vuoi dire, "pass in un valore a la tupla e farla ritornare tre valori "? Le tuple non * fanno * qualsiasi cosa tranne i dati del negozio. Chiedere a cosa serve una tupla è come chiedere a cosa serve un POCO. –

+3

Hai mai studiato cos'è una tupla prima di fare questa domanda? Quali esempi sono stati utilizzati? Forse consideri di fare una domanda più diretta, ad es. "E 'questo un buon adattamento per una tupla?" ecc. Non ti segnerò, ma questa non è davvero una buona domanda IMO. – Nathan

risposta

7

Microsoft .NET 4.0 introduce il tipo Tuple che è una raccolta di dati di tipo eterogeneo tipizzati. Come una matrice, una tupla ha una dimensione fissa che non può essere modificata una volta creata. A differenza di un array, ogni elemento di una tupla può essere di un tipo diverso e una tupla è in grado di garantire una digitazione forte per ogni elemento. Questo è davvero utile in uno scenario che altrimenti può essere raggiunto usando tipi personalizzati o struct.

+0

Anche a differenza di un array, gli elementi in un 'Tuple' sono immutabili (non è possibile modificare il loro valore dopo che la' Tuple' è stata istanziata) – Salmonstrikes

3

Tuple s a container. è possibile memorizzare qualsiasi cosa al suo interno

Per 3 articoli, si chiama Triple. 4 articoli quadrupli e così via.

In sostanza si possono semplicemente inserire elementi.

Questo è un example.

+1

Non è corretto, non ci sono triple o quadruple. Ci sono 3 tuple, 4 tuple, ecc. – alex

+1

http://en.wikipedia.org/wiki/Tuple dovresti cambiarlo nella wiki di alex. – DarthVader

+2

La domanda sulla classe Tuple: http://msdn.microsoft.com/en-us/library/system.tuple.aspx – alex

3

La tupla è un costrutto tipizzato, immutabile e generico. È un contenitore utile per la memorizzazione di dati concettualmente correlati. Una classe semplice con membri commentati e metodi aggiuntivi è più utile per cose importanti. Ma la Tupla può essere usata per memorizzare informazioni varie ma correlate. La tupla non riesce a nascondersi nel campo dell'informazione. Eccelle come un utile contenitore a breve termine.

9

Una tupla è la contropartita di una lista.

mentre l'elenco esercizi 0-N del tipo stesso di articolo, un negozio tuple 1-M di (possibilmente) diversi elementi -typed, dove N è illimitato e M è fissato staticamente/definito.

Ognuno di questi elementi è accessibile in modo fortemente tipizzato con il loro nome (o "indice" come accade per allineato).

Sono quindi simili ad un tipo anonimo (in realtà, questo è più simile a un "record" e non una "tupla", perché i nomi possono essere scelti arbitrariamente):

new { _0 = value0, _1 = value1, /* etc, as needed */ } 

Ma la tupla i tipi sono nominativamente digitati (sono supportati da un gruppo di classi diverse, come Action o Func) e quindi è possibile specificare esplicitamente un tipo di tupla specifico (ad esempio nelle firme dei metodi), che è qualcosa che un tipo anonimo non può essere usato per.

Mentre direi che l'uso pratico delle tuple in C# è ostacolata dalla mancanza di supporto (ad esempio non si decompone, nessuna applicazione, ecc), sono utilizzati tutto il tempo in lingue come Scala. L'approccio C# è generalmente quello di "creare un nuovo tipo di nome", ma introduce i tipi Tuple come un altro strumento disponibile.

(Un grosso punto in cui i Tuple sono molto utili nei calcoli intermedi - ma C# ha tipi anonimi, che come si vede con LINQ, svolgono questo ruolo abbastanza bene nella maggior parte dei casi in cui i calcoli vengono eseguiti nello stesso metodo.)

1

Tuple è una classe leggera per raggruppare più elementi. È un'alternativa alla definizione di una nuova classe ogni volta che vuoi raggruppare due elementi.

Lo trovo utile quando voglio restituire più elementi da un unico metodo, ma non posso usare i parametri ref o out.

1

Sembra che sia lì per l'archiviazione temporanea dei dati; uso molto localizzato. Queste sono occasioni in cui scrivere la tua classe è troppo dispendioso in termini di tempo o non vale la pena perché la vita dei dati è così breve.

0

.NET Framework 4 introduce la classe System.Tuple per la creazione di oggetti tuple che contengono dati strutturati. Fornisce inoltre classi di tuple generiche per supportare tuple che hanno da uno a otto componenti. Ecco esempio in C#

var objTupe = new System.Tuple<string, string, double,long>"Mike","Anderson",29000,9999999999); 
Response.Write("Item1 : " + objTupe.Item1); 
Response.Write("<br/>Item2 : " + objTupe.Item2); 
Response.Write("<br/>Item3 : " + objTupe.Item3); 
Response.Write("<br/>Item4 : " + objTupe.Item4); 
2

Un pratico caso d'uso: diciamo che si desidera passare intorno ad un elenco di dati strutturati tra i diversi componenti interni di un software.

  1. È possibile dichiarare una classe che rappresenta i dati strutturati. In questo caso questa classe deve essere stupida idealmente, conterrà solo un mazzo di proprietà auto. Probabilmente lo dichiari in un'interfaccia come una classe incorporata (ma poi devi prefissarlo con il nome dell'interfaccia), o nello stesso spazio dei nomi dell'interfaccia. Ad un certo punto questo codice idraulico forse inutile per definire una sola classe per questo scopo.
  2. Oppure è possibile utilizzare una tupla. In questo modo non devi definire una classe per tutto ciò, puoi comunque rimanere sicuro. Potresti perdere il vantaggio di nominare le proprietà, il che può essere problematico se hai molte proprietà, magari anche dello stesso tipo.

Altro esempio concreto: si desidera impostare una colonna ordinamento di un componente 3rd party TreeListView. Si avvia l'ordinamento dall'oggetto controller, che chiama la funzione corretta (SortByColumns) sulla vista, che chiama la funzione sulla classe wrapper attorno al componente di terze parti, che chiama le funzioni appropriate dei componenti di terze parti.

  1. Se si definisce un DTO (dtata oggetto di trasferimento) oggetto:

    // Somewhere around an interface 
    class ColumnSortItem 
    { 
        string Caption { get; set; } 
        SortOrder Order { get; set; } 
    } 
    
    // Other places: 
    void SortByColumns(IList<ColumnSortItem> pColumnSortItems); 
    
  2. tuple:

    void SortByColumns(IList<Tuple<string, SortOrder>> pColumnSortItems); 
    

non dico tuple sono sempre la scelta migliore , ma notiamo che abbiamo dovuto semplicemente dichiarare un determinato ordine e struttura degli articoli . Nota che in questo esempio concreto è abbastanza chiaro quale sia la parte di stringa della tupla e quale sia la parte SortOrder.

Aggiunta: le chiamate effettivi della funzione:

  1. DTO

    controller.SortByColumns(new List<ColumnSortItem>() { 
        new ColumnSortItem() { Caption = "Record", Order = SortOrder.Ascending }, 
        new ColumnSortItem() { Caption = "Description", Order = SortOrder.Ascending } 
        }); 
    
  2. Tuple

    controller.SortByColumns(new List<Tuple<string, SortOrder>>() { 
        new Tuple<string, SortOrder>("Record", SortOrder.Ascending), 
        new Tuple<string, SortOrder>("Description", SortOrder.Ascending) 
        }); 
    
+0

Nota che 'KeyValuePair' sarebbe possibile se la Tupla contiene solo due elementi, ma ci sono conseguenze di 'KeyValuePair' che è una struttura: http://www.dotnetperls.com/tuple-keyvaluepair –

Problemi correlati