什么是C ++的std ::对C#的模拟?(What is C# analog of C++ std

2019-09-04 01:46发布

我感兴趣的是:什么是C#的模拟std::pair在C ++? 我发现System.Web.UI.Pair类,但我会基于模板的东西喜欢。

谢谢!

Answer 1:

元组是因为.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


Answer 2:

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


Answer 3:

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

另外,您也可以使用匿名类型来处理的元组,至少局部:

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

最后一个选择是创建一个自己的类。



Answer 4:

C#有元组为4.0版本。



Answer 5:

一些答案似乎只是错误的,

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

这是我对班

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


Answer 6:

如果它是关于字典之类的,你要找的System.Collections.Generic.KeyValuePair <TKEY的,TValue>中。



Answer 7:

根据您想要完成的任务,你可能会想尝试KeyValuePair 。

你不能改变一个条目的关键事实当然也可以通过简单的更换由KeyValuePair的新实例整个条目予以纠正。



Answer 8:

我创建了一个C#实现的元组,它一般可以解决问题了价值二至五- 这里的博客文章 ,其中包含一个链接到源。



Answer 9:

我被问同样的问题刚才一个快速谷歌后,我发现有一个在.NET中对类除了它在System.Web.UI程序^〜^( http://msdn.microsoft.com/en-us/库/ system.web.ui.pair.aspx )天知道他们为什么把它放在那里,而不是集合框架



Answer 10:

由于.NET 4.0你有System.Tuple<T1, T2>类:

// pair is implicitly typed local variable (method scope)
var pair = System.Tuple.Create("Current century", 21);


Answer 11:

我通常延长的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);


Answer 12:

在为了获得上述工作(我需要对作为字典的键)。 我不得不添加:

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

抑制编译器警告。



Answer 13:

该PowerCollections库(以前可从Wintellect的,但现在托管在Codeplex上@ http://powercollections.codeplex.com )有一个通用的对结构。



Answer 14:

除了自定义类或.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);


文章来源: What is C# analog of C++ std::pair?