在.NET Framework 3.5中是否存在与.NET 4中的Tuple相当的类?
我想使用它来从方法返回多个值,而不是创建struct
。
在 .Net 3.5 中是不支持的。但是自己创建应该不难。
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;
}
}
更新: 将静态内容移动到静态类中以允许类型推断。使用此更新,您可以编写如 var tuple = Tuple.New(5, "hello");
的内容,并且它会隐式地自动修复类型。
Tuple
类在.NET 4.5中似乎已经发生了变化;属性现在被称为Item1
和Item2
,而不是First
和Second
。 - ashes999我在我的4.0版本之前的项目中使用了这个:
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);
}
}
Tuple<T1>
?它真的是一个元组吗? - Tomas Jansson如果您希望它们与 .Net 4.0 在功能方面具有相同水平(主要是比较),
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
}
GetHashCode()
实现是(h1 << 3) ^ h2
,而MS的实现(通过ILSpy)是(h1 << 5) + h1 ^ h2
。从性能上讲,这真的有区别吗? - tigrouNetLegacySupport.Tuple
。这是从.Net 4.5回溯到.Net 2.0和3.5的Tuple类。是的,有一个名为 System.Collections.Generic.KeyValuePair 的类可以完成同样的功能(自 .NET 2.0 起,我认为这个类就已经存在了)。
#define NET_4_0
#if NET_4_0
KeyValuePair
意味着一个 值 与一个 键 相关联。这不是我当时想要的。 - Otiel