我感兴趣的是:什么是C#的模拟std::pair
在C ++? 我发现System.Web.UI.Pair
类,但我会基于模板的东西喜欢。
谢谢!
我感兴趣的是:什么是C#的模拟std::pair
在C ++? 我发现System.Web.UI.Pair
类,但我会基于模板的东西喜欢。
谢谢!
元组是因为.NET4.0提供和支持泛型:
Tuple<string, int> t = new Tuple<string, int>("Hello", 4);
在以前的版本可以使用System.Collections.Generic.KeyValuePair<K, V>
或如下所示的解决方案:
public class Pair<T, U> {
public Pair() {
}
public Pair(T first, U second) {
this.First = first;
this.Second = second;
}
public T First { get; set; }
public U Second { get; set; }
};
并使用它像这样:
Pair<String, int> pair = new Pair<String, int>("test", 2);
Console.WriteLine(pair.First);
Console.WriteLine(pair.Second);
这种输出:
test
2
甚至这个链接对:
Pair<Pair<String, int>, bool> pair = new Pair<Pair<String, int>, bool>();
pair.First = new Pair<String, int>();
pair.First.First = "test";
pair.First.Second = 12;
pair.Second = true;
Console.WriteLine(pair.First.First);
Console.WriteLine(pair.First.Second);
Console.WriteLine(pair.Second);
输出:
test
12
true
System.Web.UI
包含在Pair
类,因为它被大量使用在ASP.NET 1.1作为内部视图状态的结构。
更新2017年8月:C#7.0 / .NET框架4.7提供了一个语法来声明使用的命名项目的元组System.ValueTuple
结构。
//explicit Item typing
(string Message, int SomeNumber) t = ("Hello", 4);
//or using implicit typing
var t = (Message:"Hello", SomeNumber:4);
Console.WriteLine("{0} {1}", t.Message, t.SomeNumber);
参见MSDN更多语法示例。
更新2012年6月: Tuples
已经从4.0版本的.NET的一部分。
下面是说明包括in.NET4.0以前的文章中对泛型和支持:
Tuple<string, int> t = new Tuple<string, int>("Hello", 4);
不幸的是,没有。 您可以使用System.Collections.Generic.KeyValuePair<K, V>
在许多情况下。
另外,您也可以使用匿名类型来处理的元组,至少局部:
var x = new { First = "x", Second = 42 };
最后一个选择是创建一个自己的类。
C#有元组为4.0版本。
一些答案似乎只是错误的,
这是我对班
public class Pair<X, Y>
{
private X _x;
private Y _y;
public Pair(X first, Y second)
{
_x = first;
_y = second;
}
public X first { get { return _x; } }
public Y second { get { return _y; } }
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (obj == this)
return true;
Pair<X, Y> other = obj as Pair<X, Y>;
if (other == null)
return false;
return
(((first == null) && (other.first == null))
|| ((first != null) && first.Equals(other.first)))
&&
(((second == null) && (other.second == null))
|| ((second != null) && second.Equals(other.second)));
}
public override int GetHashCode()
{
int hashcode = 0;
if (first != null)
hashcode += first.GetHashCode();
if (second != null)
hashcode += second.GetHashCode();
return hashcode;
}
}
下面是一些测试代码:
[TestClass]
public class PairTest
{
[TestMethod]
public void pairTest()
{
string s = "abc";
Pair<int, string> foo = new Pair<int, string>(10, s);
Pair<int, string> bar = new Pair<int, string>(10, s);
Pair<int, string> qux = new Pair<int, string>(20, s);
Pair<int, int> aaa = new Pair<int, int>(10, 20);
Assert.IsTrue(10 == foo.first);
Assert.AreEqual(s, foo.second);
Assert.AreEqual(foo, bar);
Assert.IsTrue(foo.GetHashCode() == bar.GetHashCode());
Assert.IsFalse(foo.Equals(qux));
Assert.IsFalse(foo.Equals(null));
Assert.IsFalse(foo.Equals(aaa));
Pair<string, string> s1 = new Pair<string, string>("a", "b");
Pair<string, string> s2 = new Pair<string, string>(null, "b");
Pair<string, string> s3 = new Pair<string, string>("a", null);
Pair<string, string> s4 = new Pair<string, string>(null, null);
Assert.IsFalse(s1.Equals(s2));
Assert.IsFalse(s1.Equals(s3));
Assert.IsFalse(s1.Equals(s4));
Assert.IsFalse(s2.Equals(s1));
Assert.IsFalse(s3.Equals(s1));
Assert.IsFalse(s2.Equals(s3));
Assert.IsFalse(s4.Equals(s1));
Assert.IsFalse(s1.Equals(s4));
}
}
如果它是关于字典之类的,你要找的System.Collections.Generic.KeyValuePair <TKEY的,TValue>中。
根据您想要完成的任务,你可能会想尝试KeyValuePair 。
你不能改变一个条目的关键事实当然也可以通过简单的更换由KeyValuePair的新实例整个条目予以纠正。
我创建了一个C#实现的元组,它一般可以解决问题了价值二至五- 这里的博客文章 ,其中包含一个链接到源。
我被问同样的问题刚才一个快速谷歌后,我发现有一个在.NET中对类除了它在System.Web.UI程序^〜^( http://msdn.microsoft.com/en-us/库/ system.web.ui.pair.aspx )天知道他们为什么把它放在那里,而不是集合框架
由于.NET 4.0你有System.Tuple<T1, T2>
类:
// pair is implicitly typed local variable (method scope)
var pair = System.Tuple.Create("Current century", 21);
我通常延长的Tuple
类到我自己的通用包装如下:
public class Statistic<T> : Tuple<string, T>
{
public Statistic(string name, T value) : base(name, value) { }
public string Name { get { return this.Item1; } }
public T Value { get { return this.Item2; } }
}
并使用它像这样:
public class StatSummary{
public Statistic<double> NetProfit { get; set; }
public Statistic<int> NumberOfTrades { get; set; }
public StatSummary(double totalNetProfit, int numberOfTrades)
{
this.TotalNetProfit = new Statistic<double>("Total Net Profit", totalNetProfit);
this.NumberOfTrades = new Statistic<int>("Number of Trades", numberOfTrades);
}
}
StatSummary summary = new StatSummary(750.50, 30);
Console.WriteLine("Name: " + summary.NetProfit.Name + " Value: " + summary.NetProfit.Value);
Console.WriteLine("Name: " + summary.NumberOfTrades.Value + " Value: " + summary.NumberOfTrades.Value);
在为了获得上述工作(我需要对作为字典的键)。 我不得不添加:
public override Boolean Equals(Object o)
{
Pair<T, U> that = o as Pair<T, U>;
if (that == null)
return false;
else
return this.First.Equals(that.First) && this.Second.Equals(that.Second);
}
有一次我这样做,我也加
public override Int32 GetHashCode()
{
return First.GetHashCode() ^ Second.GetHashCode();
}
抑制编译器警告。
该PowerCollections库(以前可从Wintellect的,但现在托管在Codeplex上@ http://powercollections.codeplex.com )有一个通用的对结构。
除了自定义类或.Net 4.0元组,因为C#7.0有一个叫ValueTuple的新功能,它是一种可在这种情况下使用的结构。 而是写:
Tuple<string, int> t = new Tuple<string, int>("Hello", 4);
并通过访问值t.Item1
和t.Item2
,你可以简单地做这样的:
(string message, int count) = ("Hello", 4);
甚至:
(var message, var count) = ("Hello", 4);