用于.NET Framework 3.5的元组(.NET 4)等效

.NET Framework 3.5中是否存在与.NET 4 Tuple等效的类?

我想使用它来从一个方法返回几个值,而不是创build一个struct

不,不在.Net 3.5中。 但是创build自己的应该不是那么难。

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

更新:将静态的东西移动到一个静态类,以允许types推断。 随着更新,你可以写var tuple = Tuple.New(5, "hello"); 它会隐式地修复你的types。

我在我的前四个项目中使用这个:

 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); } } 

如果您需要它们与.Net 4.0(主要是比较)function相同:

 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 } 

您可以通过nuget安装NetLegacySupport.Tuple。 这是从.Net 4.5反转到.Net 2.0和3.5的Tuple类。

您可以通过Visual Studio中的包pipe理器或命令行上的nuget来安装。

这里是nuget包:

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

是的,有一个名为System.Collections.Generic.KeyValuePair的类可以做同样的事情(因为.NET 2.0我认为)。

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

是的,你可以从单声道使用Tuple.cs :

您还需要依赖关系:
Tuples.cs
IStructuralComparable.cs
IStructuralEquatable.cs

你只是把一个

 #define NET_4_0 

在每一个面前

 #if NET_4_0 

在那里你可以看到.NET 2.0的System.Tuplefunction完整的实现。