C ++ std :: pair的C#模拟是什么?

我感兴趣什么是C + + std :: pair的C#模拟? 我find了System.Web.UI.Pair类,但想要基于模板的东西。

谢谢!

元组自.NET4.0起可用,并支持generics:

Tuple<string, int> t = new Tuple<string, int>("Hello", 4); 

在以前的版本中,您可以使用System.Collections.Generic.KeyValuePair<K, V>或以下解决scheme:

 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中作为内部ViewState结构大量使用。

2017年8月更新: C#7.0 / .NET Framework 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的一部分。

这里是一个早期的文章,描述在.NET4.0中的包含和支持generics:

 Tuple<string, int> t = new Tuple<string, int>("Hello", 4); 

不幸的是,没有。 在很多情况下System.Collections.Generic.KeyValuePair<K, V>您可以使用System.Collections.Generic.KeyValuePair<K, V>

或者,您可以使用匿名types处理元组,至less在本地处理:

 var x = new { First = "x", Second = 42 }; 

最后的select是创build一个自己的类。

C#具有4.0版本的元组 。

有些答案似乎是错的,

  1. 你不能使用字典将如何存储对(a,b)和(a,c)。 对概念不应该混淆关键和价值观的联合查询
  2. 很多上面的代码似乎是可疑的

这是我的配对class

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

这里是一些testing代码:

 [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 。

您无法更改条目的键的事实当然可以通过简单地将整个条目replace为KeyValuePair的新实例来纠正。

我创build了一个元组的C#实现,它通常解决了两个和五个值之间的问题 – 这里是博客文章 ,其中包含一个链接到源代码。

我刚才问同样的问题后,快速谷歌我发现有一个.NET类除了它在System.Web.UI ^〜^( http://msdn.microsoft.com/en-us/ library / 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获得,但现在托pipe在Codeplex @ http://powercollections.codeplex.com上; )具有通用的Pair结构。

除了自定义类或.Net 4.0元组之外,由于C#7.0中有一个名为ValueTuple的新特性,这是一个可以在这种情况下使用的结构。 而不是写作:

 Tuple<string, int> t = new Tuple<string, int>("Hello", 4); 

并通过t.Item1t.Item2访问值,你可以简单地这样做:

 (string message, int count) = ("Hello", 4); 

甚至:

 (var message, var count) = ("Hello", 4);