C# 相当于.NET Framework 3.5的元组(.NET 4)

C# 相当于.NET Framework 3.5的元组(.NET 4),c#,.net-3.5,tuples,C#,.net 3.5,Tuples,在.NETFramework3.5中是否存在与.NET4相当的类 我想使用它从一个方法返回多个值,而不是在.NET3.5中创建一个结构。但创建自己的应该不会那么难 public class Tuple<T1, T2> { public T1 First { get; private set; } public T2 Second { get; private set; } internal Tuple(T1 first, T2 second) {

在.NETFramework3.5中是否存在与.NET4相当的类


我想使用它从一个方法返回多个值,而不是在.NET3.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;
    }
}
公共类元组
{
公共T1第一个{get;私有集;}
公共T2秒{get;私有集;}
内部元组(T1第一,T2第二)
{
第一=第一;
秒=秒;
}
}
公共静态类元组
{
新的公共静态元组(T1第一,T2第二)
{
var tuple=新的tuple(第一个,第二个);
返回元组;
}
}

更新:将静态内容移动到静态类以允许类型推断。通过更新,您可以编写类似
var tuple=tuple.New(5,“hello”),它会隐式地为您修复类型。

我在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); 
    }  
}
公共类元组
{ 
公共元组(T1项1)
{ 
第1项=第1项;
}   
公共T1项1{get;set;}
} 
公共类Tuple:Tuple
{ 
公共元组(T1项1,T2项2):基(项1)
{ 
第2项=第2项;
} 
公共T2项2{get;set;}
} 
公共类Tuple:Tuple
{ 
公共元组(T1项1、T2项2、T3项3):基(项1、项2)
{ 
第3项=第3项;
} 
公共T3项3{get;set;}
} 
公共静态类元组
{ 
公共静态元组创建(T1项1)
{ 
返回新的元组(item1);
} 
公共静态元组创建(T1项1,T2项2)
{ 
返回新的元组(item1,item2);
} 
创建公共静态元组(T1项1、T2项2、T3项3)
{ 
返回新的元组(item1、item2、item3);
}  
}

如果您需要它们具有与.Net 4.0相同的功能(主要是比较):

静态类元组
{
公共静态元组创建(T1项1,T2项2)
{
返回新的元组(item1,item2);
}
}
[调试器显示(“Item1={Item1};Item2={Item2}”)]
类元组:可附加
{
公共T1项1{get;私有集;}
公共T2项2{get;私有集;}
公共元组(T1项1,T2项2)
{
第1项=第1项;
第2项=第2项;
}
#区域可选-如果需要在字典中使用或检查相等性
私有静态只读IEqualityComparer项1Comparer=EqualityComparer.Default;
私有静态只读IEqualityComparer Item2Comparer=EqualityComparer.Default;
公共覆盖int GetHashCode()
{
var hc=0;
如果(!object.ReferenceEquals(Item1,null))
hc=项目1比较程序GetHashCode(项目1);
如果(!object.ReferenceEquals(Item2,null))

hc=(hc是的,有一个名为System.Collections.Generic.KeyValuePair的类做同样的事情(我认为是从.NET 2.0开始)

是的,您可以从mono使用:

您还需要依赖项:



你只要放一个

#define NET_4_0
在每个人面前

#if NET_4_0

现在是.NET 2.0的System.Tuple的功能完整实现。

您可以通过nuget安装
NetLegacySupport.Tuple
。这是从.NET 4.5后端口到.NET 2.0和3.5的Tuple类

您可以通过VisualStudio中的软件包管理器或使用命令行上的nuget来安装它

以下是nuget软件包:


简短的回答是否定的。我的答案是两个项的
Tuple
类的简单实现。我使用的Tuple越多,我就越喜欢专用的结构--.Item1、.Item2的模糊性,当你记不起其中的内容时,这有点烦人。为什么不返回一个带有公共memb的类的实例,而不是一个结构呢你想返回的对象?我认为这会让所有内容都更加自我记录。结构也是如此,但我个人更喜欢类而不是结构。@Wardy
KeyValuePair
意味着有一个值与一个键关联。这不是我当时想要的。它不需要更多的参与,这取决于你的业务需要。问题是ys:“我想使用它来从一个方法返回多个值,而不是创建一个结构。”您不需要比较和相等。第一,您没有提供.NET 4.0元组提供的相等实现;第二,您在最后一种情况下谈论的是类型推断,而不是隐式转换。@nawfal,谢谢您的类型推断。关于相等实现,您可以需要我的评论。这可能不需要根据业务需要,我回答了具体的问题,没有编写一个完整的实现,因为它是在.NET 4.0中实现的。此外,我也没有说这是tuples.Hmmm的完整实现。q是关于.NET 4.0元组的等价物。不是吹毛求疵,但元组的可平等性是初学者通常忽略的。这一方面实际上值得一提。仅供参考,
Tuple
类在.NET 4.5中似乎已经发生了变化;属性被称为
Item1
Item2
,而不是
First
Second
。为什么需要
Tuple
?这甚至是一个Tuple吗?答案不错。这就是我要找的(我在一个项目中,我被困在3.5)问题:你的
GetHashCode()
实现是
(h1@tigrou XOR应该比用来实现它的硅量稍微快一点(不过它仍然是一条CPU指令)。这严重超出了微优化的范围-请随意使用您认为合适的。我考虑的是可能发生的冲突,而不是计算哈希代码所花费的时间。@tigrou我想唯一的方法是测试它。这很好,避免了装箱(即使是.NET实现也不这样做)。一个小建议,您不需要在哈希代码函数中进行空检查,比较器会为您进行空检查
#if NET_4_0