我发现自己有时在C#3.0寻找各种方法,以模拟的概念tuple.随着时间的推移,我们已经有各种各样的"穷人"的实现,这里有几个:

基本目标阵列:

object[] poorTuple = new object[]{foo,bar,baz}; // basic object array

更强烈的类型,Z...

KeyValuePair<TypeA, KeyValuePair<TypeB, TypeC>> poorTuple;

执行一个类 这可以使用类型的推断(从解除 功能方案编制现实世界)

public static class Tuple{
  public static Tuple<T1, T2> Create<T1 foo, T2 bar>{
    return new Tuple<T1, T2>(foo, bar);
  }
}
// later: 
var data = Tuple.Create("foo", 42);

问题:

  1. 任何其他方式具有一个穷人的多元组在C#3.0(或选择的语言,缺乏数据结构)。

  2. 什么是的 最好的 的方式来获得一个多元组在C#3.0-如果任何人有一个图书馆的建议是受欢迎的。

  3. 在什么点(是的,一概而论对我来说)是否有意义,创建一个特定的类型,而不是喜欢的东西的列表或tuple?(寻找规则)

有帮助吗?

解决方案

你可以创建匿名类型功能类似于组,除了有用的名称:

var itemsWithChildCounts 
    = myObjects.Select(x => new { Name = x.Name, Count = x.Children.Count() });

其他提示

这里是代码,用于一般的多元组采取了从比尔*瓦格纳的 文章 在2007年四月版 Visual Studio杂志.

public struct Tuple<T1, T2> : IEquatable<Tuple<T1, T2>>
{
    private readonly T1 first;
    public T1 First
    {
        get { return first; }
    }

    private readonly T2 second;
    public T2 Second
    {
        get { return second; }
    } 

    public Tuple(T1 f, T2 s)
    {
        first = f;
        second = s;
    }

    #region IEquatable<Tuple<T1,T2>> Members
    public bool Equals(Tuple<T1, T2> other)
    {
        return first.Equals(other.first) && 
            second.Equals(other.second);
    }

    public override bool Equals(object obj)
    {
        if (obj is Tuple<T1, T2>)
            return this.Equals((Tuple<T1, T2>)obj);
        else
            return false;
    }

    public override int GetHashCode()
    {
        return first.GetHashCode() ˆ second.GetHashCode();
    }
    #endregion
}

对于1-2:我更喜欢实施自己的多元组类。执行你偷了是一个体面的一个。它应该很好的工作。

3:这是我的规则的拇指-只要你要重复使用这一功能的多种方法(与同一类型具有相同的含义),或者如果你用它在任何公共API,我认为这是时间来实施一个"真正的"类的具体类型。

  1. 将"实现一类"的方法为好,因为它会(它应该在下一个版本。净无论如何)
  2. 不知道,我让他们在我自己的个人的类库。
  3. 我会考虑创建一个适当的类为他们尽快得到暴露给公众(即当他们不再只是用来储存有关的价值观一级的内部).

因为你问的意见,我会总是创建一种类型的--我找不出一个原因。

往往不你可以发现,实际上,你需要的类型(主要使用储存中的两个项目集合或返回的两个项目从一方法的话--在这两种情况下,如果项目不是密切相关,你可能做错了什么).

我认为这是良好的,以创建一个新的类型的时候很有意义,引进新的价值设置为你的节目。例如,如果你正在写一个复杂的计算器,随后使一个复杂的数类型。如果你真的只是想要"胶水"几个变量在一起一会儿,然后一组可能是更好的选择。让我们说你有一个简单的功能,收集两个数字从控制台...你可能会这样做:

static void GetNumbers(out int x, out int y) { ... }
...
int x, y;
GetNumbers(out x, out y);

我认为,它通常有意义的当"气剂"功能具有返回的价值,但在这种情况下,它并不因为我真的不能有两个返回值。我可以去做一个新的类型称为TwoNumbers和使用,但我认为这个快速成为一个更大的问题比解决方案。如果C#有组,我可能能够这样做如下:

static (int, int) GetNumbers() { ... }
...
int x, y;
(x, y) = GetNumbers();

现在真正有趣的问题是:虽然C#没有这个功能我能够实现它自己的图书馆?代码你的建议是一个开始,但是不会允许我分配像我已经做了在第二个例子。我不知道C#但你可以得到真不错,靠近这C++通过使用这一事实, 呼叫功能可以左操作数的分配操作者当它返回值是一个基准类型.考虑以下几点:

// this class is implemented much like yours only with C++
template<typename T1, typename T2> class tuple { ... }
...
template<typename T1, typename T2> tuple<T1, T2>& tie(T1 a, T2 b) { ... }
...
template<typename T1, typename T2> tuple<T1, T2> get_numbers() { ... }
...
int x, y;
tie(x, y) = get_numbers();

我想说这是非常接近...而不是的 (x, y) = 我们 tie(x, y) =.如果你有兴趣执行情况的详细信息,我指你的TR1图书馆,在那里我第一次了解了这一点:

http://www.boost.org/doc/libs/1_41_0/libs/tuple/doc/tuple_users_guide.html#tiers

所以把所有这回C#3.0...我们当然可以创建一个通用的元组类作为你已经证明,但是我们可以创建一个功能喜欢领带要"解开"元组在C#?我没有尝试过,听起来很有趣。没有这样的事情,我可不愿意让一个C#tuple库的扩散,通过我的代码。

我不喜欢的类型推理在C#因为它被滥用来从较短的写作。当然,这是一个很酷的功能,但人们滥用这恕我直言,在这种情况。

在这种情况下,我将指定的类型,明确地为了避免混乱有关的类型(即也许42是一个长期的,或者一个字或一个短的)。

那么,为什么没有一个简单元组类,从而可以实现在只有几行。如果你懒惰你甚至可以写一些扩展方法为你的元组类。这使生活更容易的,但也更清洁。

没有看到有一个"幻想"tuple类,而不是通用的一个,你提出的(除种类型的推断).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top