【问题标题】:C# ValueTuple of any size任意大小的 C# ValueTuple
【发布时间】:2019-06-02 08:55:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# collections tuples


    【解决方案1】:

    您可以使用 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;
    }
    

    这也可以用作扩展方法:

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

    这样可以写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;
    }
    

    【讨论】:

    • 哦,我不知道他们添加了那个接口,我记得想要使用常规元组的类似的东西。很高兴知道。
    • @JeffMercado 由于有一个ToValueTuple 扩展方法,您可以将一个元组转换为一个ValueTuple,然后利用ITuple 接口。
    • 哦,我知道,我只是说在 ValueTuple 出现之前,常规的 Tuple 类型没有通用接口,这使得尝试构建对元组进行操作的东西变得不必要地困难.
    • VS 似乎找不到ITuple 类型。我正在使用 .NET Core 2.0 和 using System.Runtime.CompilerServices。我还引用了System.ValueTuple。我还需要什么吗?
    • @Sweeper,我刚刚设置了一个快速的 netcore 应用程序并将接口转储到 valuetuple 类型上,它包括 ITuple 所以它似乎不需要其他任何东西。您是否正在运行稳定版本?我目前有 2.2.100。
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2017-04-06
    • 2015-03-08
    • 2013-05-09
    相关资源
    最近更新 更多