web-dev-qa-db-fra.com

Équivalent de Tuple (.NET 4) pour .NET Framework 3.5

Existe-t-il une classe existante dans .NET Framework 3.5 qui serait équivalente à .NET 4 Tuple ?

Je voudrais l'utiliser pour retourner plusieurs valeurs à partir d'une méthode, plutôt que de créer un struct.

58
Otiel

Non, pas dans .Net 3.5. Mais il ne devrait pas être si difficile de créer le vôtre.

public class Tuple<T1, T2>
{
    public T1 First { get; private set; }
    public T2 Second { get; private set; }
    internal Tuple(T1 first, T2 second)
    {
        First = first;
        Second = second;
    }
}

public static class Tuple
{
    public static Tuple<T1, T2> New<T1, T2>(T1 first, T2 second)
    {
        var Tuple = new Tuple<T1, T2>(first, second);
        return Tuple;
    }
}

PDATE: Déplacement des éléments statiques dans une classe statique pour permettre l'inférence de type. Avec la mise à jour, vous pouvez écrire des trucs comme var Tuple = Tuple.New(5, "hello"); et cela corrigera implicitement les types pour vous.

78
Tomas Jansson

J'utilise ceci dans mes projets pré-4:

public class Tuple<T1>  
{ 
    public Tuple(T1 item1) 
    { 
        Item1 = item1; 
    }   

    public T1 Item1 { get; set; }  
} 

public class Tuple<T1, T2> : Tuple<T1>  
{ 
    public Tuple(T1 item1, T2 item2) : base(item1) 
    { 
        Item2 = item2; 
    } 

    public T2 Item2 { get; set; }  
} 

public class Tuple<T1, T2, T3> : Tuple<T1, T2>  
{ 
    public Tuple(T1 item1, T2 item2, T3 item3) : base(item1, item2) 
    { 
        Item3 = item3; 
    } 

    public T3 Item3 { get; set; }  
} 

public static class Tuple  
{ 
    public static Tuple<T1> Create<T1>(T1 item1) 
    { 
        return new Tuple<T1>(item1); 
    } 

    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) 
    { 
        return new Tuple<T1, T2>(item1, item2); 
    } 

    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) 
    { 
        return new Tuple<T1, T2, T3>(item1, item2, item3); 
    }  
}
25
Hrvoje Hudo

Dans le cas où vous en avez besoin pour avoir la parité des fonctionnalités avec .Net 4.0 (principalement comparisson):

static class Tuple
{
    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
    {
        return new Tuple<T1, T2>(item1, item2);
    }
}

[DebuggerDisplay("Item1={Item1};Item2={Item2}")]
class Tuple<T1, T2> : IFormattable
{
    public T1 Item1 { get; private set; }
    public T2 Item2 { get; private set; }

    public Tuple(T1 item1, T2 item2)
    {
        Item1 = item1;
        Item2 = item2;
    }

    #region Optional - If you need to use in dictionaries or check equality
    private static readonly IEqualityComparer<T1> Item1Comparer = EqualityComparer<T1>.Default;
    private static readonly IEqualityComparer<T2> Item2Comparer = EqualityComparer<T2>.Default;

    public override int GetHashCode()
    {
        var hc = 0;
        if (!object.ReferenceEquals(Item1, null))
            hc = Item1Comparer.GetHashCode(Item1);
        if (!object.ReferenceEquals(Item2, null))
            hc = (hc << 3) ^ Item2Comparer.GetHashCode(Item2);
        return hc;
    }
    public override bool Equals(object obj)
    {
        var other = obj as Tuple<T1, T2>;
        if (object.ReferenceEquals(other, null))
            return false;
        else
            return Item1Comparer.Equals(Item1, other.Item1) && Item2Comparer.Equals(Item2, other.Item2);
    }
    #endregion

    #region Optional - If you need to do string-based formatting
    public override string ToString() { return ToString(null, CultureInfo.CurrentCulture); }
    public string ToString(string format, IFormatProvider formatProvider)
    {
        return string.Format(formatProvider, format ?? "{0},{1}", Item1, Item2);
    }
    #endregion
}
24
Jonathan Dickinson

Vous pouvez installer NetLegacySupport.Tuple via nuget. Il s'agit de la classe Tuple de .Net 4.5 rétroportée vers .Net 2.0 et 3.5.

Vous pouvez l'installer via le gestionnaire de packages dans Visual Studio ou en utilisant nuget sur la ligne de commande.

Voici le paquet nuget:

https://www.nuget.org/packages/NetLegacySupport.Tuple

5
Ashley Davis

Oui, vous pouvez simplement utiliser Tuple.cs à partir de mono:

Vous avez également besoin des dépendances:
Tuples.cs
IStructuralComparable.cs
IStructuralEquatable.cs

Vous venez de mettre un

#define NET_4_0

devant chaque

#if NET_4_0

et voilà, une implémentation complète de System.Tuple pour .NET 2.0.

2
Stefan Steiger

Oui, il existe une classe appelée System.Collections.Generic.KeyValuePair qui fait la même chose (depuis .NET 2.0 je pense).

http://msdn.Microsoft.com/en-us/library/5tbh8a42.aspx

2
Ricky Helgesson