任意大小的 C# ValueTuple

Kob*_*ari 5 c# collections tuples

是否可以编写一个 C# 方法来接受具有任意数量的相同类型项的值元组并将它们转换为列表?

编辑 2/6/2019 我接受了提供的答案作为正确答案。我还想提供一个使用基类而不是接口的解决方案,因为我正在尝试编写一个转换运算符,并且不允许从接口进行用户定义的转换。

public static class TupleExtensions
{
    public static IEnumerable<object> Enumerate(this ValueType tpl)
    {
        var ivt = tpl as ITuple;
        if (ivt == null) yield break;

        for (int i = 0; i < ivt.Length; i++)
        {
            yield return ivt[i];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

cku*_*uri 7

您可以利用 ValueTuples 实现ITuple接口这一事实。

唯一的问题是元组元素可以是任意类型,因此列表必须接受任何类型。

public List<object> TupleToList(ITuple tuple)
{
  var result = new List<object>(tuple.Length);
  for (int i = 0; i < tuple.Length; i++)
  {
    result.Add(tuple[i]);
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

这也可用作扩展方法:

public static class ValueTupleExtensions
{
  public static List<object> ToList(this ITuple tuple)
  {
    var result = new List<object>(tuple.Length);
    for (int i = 0; i < tuple.Length; i++)
    {
      result.Add(tuple[i]);
    }
    return result;
  }
}
Run Code Online (Sandbox Code Playgroud)

这样就可以写了var list = (123, "Text").ToList();

编辑 2020-06-18:如果元组的每个元素都是相同类型,则可以创建具有正确元素类型的列表:

public List<T> TupleToList<T>(ITuple tuple)
{
  var result = new List<T>(tuple.Length);
  for (int i = 0; i < tuple.Length; i++)
  {
    result.Add((T)tuple[i]);
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)