【问题标题】:Creating subtuple from a valuetuple从值元组创建子元组
【发布时间】:2018-09-19 18:30:29
【问题描述】:

C# 7 ValueTuple 是否有类似于 Python 切片的功能? C# 中值元组的语法类似于 Python,但我找不到从元组中获取子元组的优雅方法。

在 Python 3 中:

 tuple = (1,2,3)
 subtuple = t[:2]   #subtuple is (1, 2)

在 C# 7 中:

 var tuple = (1,2,3)   //Very similar to Python!
 var subtuple = (tuple.Item1, tuple.Item2)  //Not very elegant, especially for bigger tuples

【问题讨论】:

  • AFAIK,这里的答案很简单:“不”
  • 在 Python 中它就像一个数组,但在这里你有一个像对象的东西
  • 检查这是否对您有帮助:stackoverflow.com/questions/18558353/…
  • @silkfire 很难使用反射,因为其意图通常是尊重元素的逻辑 名称,而这些名称不可用 到任何反射 API;它必须是一种语言功能。此外,大型元组中最终“其他所有”值的扩展/回滚真的很难作为反射处理。
  • C# 是静态类型的,因此仅出于这个原因,python 语法是不可能的,因为在您的示例中 subtuple 的类型无法在编译时确定(它可以是 ValueTuple 或 ValueTuple 等)。

标签: c# python c#-7.0 valuetuple


【解决方案1】:

不,C# 中没有类似的东西。由于 C# 的静态类型特性,这样的功能不能用于切片点的任意表达式。

我认为你能得到的最接近的方法是创建一堆扩展方法,在它们的名称中嵌入切片点。例如:

public static (T1, T2) Take2<T1, T2, T3>(this (T1, T2, T3) tuple) =>
    (tuple.Item1, tuple.Item2);

var tuple = (1,2,3);
var subtuple = tuple.Take2();

注意,如果元组成员有名字,这将把它们去掉。

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多