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版本的元组 。
有些答案似乎是错的,
- 你不能使用字典将如何存储对(a,b)和(a,c)。 对概念不应该混淆关键和价值观的联合查询
- 很多上面的代码似乎是可疑的
这是我的配对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.Item1
和t.Item2
访问值,你可以简单地这样做:
(string message, int count) = ("Hello", 4);
甚至:
(var message, var count) = ("Hello", 4);
- C#中的引用types
- C#.NET + PostgreSQL
- 在.NET中序列化对象时忽略所有xsi和xsd命名空间?
- 步入属性/函数(F11)不能按预期方式工作
- Windows 7 .net Excel .SaveAs()错误exception来自HRESULT:0x800A03EC
- System.Array.CopyTo()和System.Array.Clone()之间的区别
- 如何去除“button”的“点击”事件的所有事件处理程序?
- System.IO.IOException:使用System.IO.Path.GetTempFileName()时parsing“该文件存在”?
- .NET应用程序中的最大线程数?