C#3.0元组等价物(适合穷人)

t3r*_*rse 7 tuples c#-3.0

我偶尔会发现自己在C#3.0中寻找模拟元组概念的方法.随着时间的推移,我有各种"穷人"的实现,这里有一些:

基本对象数组:

object[] poorTuple = new object[]{foo,bar,baz}; // basic object array
Run Code Online (Sandbox Code Playgroud)

更强烈的类型,HoHoHo ......

KeyValuePair<TypeA, KeyValuePair<TypeB, TypeC>> poorTuple;
Run Code Online (Sandbox Code Playgroud)

实现一个可以使用类型推断的类(从真实世界的函数编程中解除)

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);
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 在C#3.0(或缺乏数据结构的选择语言)中使用穷人元组的任何其他方法.

  2. 在C#3.0中获取元组的最佳方法是什么- 如果有人有图书馆推荐,欢迎使用.

  3. 在什么时候(是的,概括为我)创建一个特定类型而不是列表或元组之类的东西是否有意义?(寻找经验法则)

Mar*_*ers 8

您可以创建与元组功能类似的匿名类型,但有用的名称除外:

var itemsWithChildCounts 
    = myObjects.Select(x => new { Name = x.Name, Count = x.Children.Count() });
Run Code Online (Sandbox Code Playgroud)

  • 匿名类型不能在创建它们的方法之外传递,因此它们在这方面的用处相当少. (4认同)

Mat*_*vis 5

以下是Bill Wagner 在2007年4月版Visual Studio Magazine中文章中的通用元组代码.

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
}
Run Code Online (Sandbox Code Playgroud)