标签: valuetuple

检测对象是否为ValueTuple

我有一个用例,我需要检查一个值是否是C#7 ValueTuple,如果是,则循环遍历每个项目.我试着用检查obj is ValueTupleobj is (object, object)但是这两个的返回false.我发现我可以使用obj.GetType().Name并检查它是否以它开头,"ValueTuple"但这对我来说似乎很蹩脚.任何替代品都会受到欢迎.

我也有获得每个项目的问题.我尝试Item1使用此处找到的解决方案:如何检查c#中动态匿名类型上是否存在属性?((dynamic)obj).GetType().GetProperty("Item1")返回null.我希望我能做一件事while来获得每件物品.但这不起作用.我如何获得每件商品?

更新 - 更多代码

if (item is ValueTuple) //this does not work, but I can do a GetType and check the name
{
    object tupleValue;
    int nth = 1;
    while ((tupleValue = ((dynamic)item).GetType().GetProperty($"Item{nth}")) != null && //this does not work
        nth <= 8)      
    {
        nth++;
        //Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# valuetuple

10
推荐指数
3
解决办法
1700
查看次数

我无法通过c#7.0中的反射从valuetuple获取参数名称

我想使用反射将ValueTuple映射到类.文档说有一个属性附加到ValueTuple有参数名称(除了Item1,Item2等...)但我看不到任何属性.

反汇编没有显示任何内容.

发生什么事?

例:

public static T ToStruct<T, T1,T2>(this ValueTuple<T1,T2> tuple) where T : struct
Run Code Online (Sandbox Code Playgroud)

通过反射无法通过反射获得Item1,Item2名称与T字段匹配.

c# c#-7.0 valuetuple

9
推荐指数
2
解决办法
1571
查看次数

将ValueTuple转换为IEnumerable

是否有更好的方法来执行以下操作:

public static class ValueTupleAdditions {
  public static IEnumerable<object> ToEnumerable<A, B>(this ValueTuple<A, B> tuple) {
    yield return tuple.Item1;
    yield return tuple.Item2;
  }
  public static IEnumerable<object> ToEnumerable<A, B, C>(this ValueTuple<A, B, C> tuple) {
    yield return tuple.Item1;
    yield return tuple.Item2;
    yield return tuple.Item3;
  }

  [etc]
}
Run Code Online (Sandbox Code Playgroud)

编辑:由于人们要求用例,所以你去.

using Xunit;

namespace Whatever {

  public class SomeTestClass {
    public static IEnumerable<(string, Expression<Func<string, string>>, string)> RawTestData() {
      yield return ("Hello", str => str.Substring(3), "lo");
      yield return ("World", str => str.Substring(0, 4), "worl");
    }
    public …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable valuetuple

9
推荐指数
1
解决办法
1463
查看次数

ValueTuples是否适合作为字典键?

我想这可能是一个方便的字典:

var myDict = new Dictionary<(int, int), bool>();
Run Code Online (Sandbox Code Playgroud)

哈希会是什么样子?
等效键类型(struct)是什么样的?

c# dictionary valuetuple

9
推荐指数
1
解决办法
1496
查看次数

带有一次性成员的C#ValueTuple

假设我有一个方法foo可以返回ValueTuple其中一个成员是一次性的,例如(IDisposable, int).

确保返回的一次性物体在呼叫方面正确配置的最佳方法是什么?

我尝试了以下方法:

using (var (disposable, number) = foo())
{
    // do some stuff using disposable and number
}
Run Code Online (Sandbox Code Playgroud)

但这不会编译:

'(IDisposable disposable,int number)':using语句中使用的类型必须可以隐式转换为'System.IDisposable'

我是否真的需要将我的代码包装在try-finally块中并将我的对象显式地放在finally块中,或者有更好的方法吗?

实际上我希望看​​到新的ValueTuples实现IDisposable接口并调用Dispose()他们所有的一次性成员.这可能是微软有价值的功能要求吗?

c# idisposable using valuetuple

8
推荐指数
1
解决办法
650
查看次数

C#ValueTuple属性命名

我在C#中尝试使用ValueTuple类,我对属性命名有疑问,让我们看看:

如果实例化一个ValueTuple声明这样的对象:var tuple1 = (Name: "Name1", Age: 25); 我们可以命名属性,

但是,像这样: ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);

我们得到一个警告,说明名字被忽略了,所以

我们应该输入: ValueTuple<string,int> tuple2 = ("Name1",25);

然后属性将是tuple2.Item1tuple2.Item2

有人能解释这个新手的原因吗?

比你有利

c# c#-7.0 valuetuple

7
推荐指数
1
解决办法
2871
查看次数

为 ValueTuple 中的命名元素添加 XML 文档

ValueTuple在C#7,现在可以编写回归方法和属性或不明确声明类型消耗复合对象。然而,当没有提供文档时,这些命名元组可能会造成混淆。

由于记录库的主要并且可能是最方便的方法是使用 XML 文档,有没有什么方法可以使用 XML 文档来提供命名元组中变量的描述?

我知道显而易见的解决方案是声明一个类型并相应地记录它。但是,由于某些无法完成的“原因”,是否可以将 XML 文档中的数据成员记录在ValueTuple?

注: 类似的问题被问的来临之前ValueTuple

xml-documentation c#-7.0 valuetuple

7
推荐指数
1
解决办法
1047
查看次数

System.ValueTuple 4.4.0-&gt; 4.5.0中发生了什么变化?

我考虑将我的System.ValueTuple参考文献从4.4.0 更新到(当前)4.5.0。

为了避免回归,我想找出这两个版本之间的变化。该的NuGet页说:

发行说明

https://go.microsoft.com/fwlink/?LinkID=799421

链接到.NET Core github存储库。

“发行说明”链接是否损坏,或者.NET Core github存储库是否实际上包含其更改日志System.ValueTuple?如果是后者,它到底在哪里?我尝试System.ValueTuple存储库中进行搜索,这会产生一些结果,但是并没有帮助我找到4.4.0和4.5.0版本之间的更改。

.net c# base-class-library c#-7.0 valuetuple

7
推荐指数
1
解决办法
903
查看次数

为什么ValueTuple使用非标准的IComparable实现?

ValueTuple.IComparable.CompareTo(Object)的文档说它返回:

0如果other是ValueTuple实例; 否则,1如果other为null.

这使得IComparable实现看起来似乎毫无用处,除了可能没有破坏可能期望实现接口的代码.旧的引用Tuple类确实遵循标准实现(尽管它可能仅在项支持时才有效IComparable).

文档IComparable说明了可以对类型进行排序,但情况并非如此ValueTuple:

此接口由可以对其值进行排序或排序的类型实现.它要求实现类型定义了一个方法,的CompareTo,指示当前实例的排序顺序的位置是否是前,后,或相同的相同类型的第二个目的.(......)

CompareTo方法的实现必须返回具有三个值之一的Int32,如下表所示.

小于零当前实例位于排序顺序中CompareTo方法指定的对象之前.

此当前实例出现在排序顺序中与CompareTo方法指定的对象相同的位置.

大于零此当前实例遵循排序顺序中CompareTo方法指定的对象.

所以我的问题是:

  • 为什么不像Tuple那样ValueTuple实现CompareTo呢?
  • 为什么它实现IComparable即使它不支持有意义的排序?

c# icomparable valuetuple

6
推荐指数
1
解决办法
260
查看次数

为什么 ValueTuple 不能是 const?

声明为字段的 ValueTuple 类型可以是可变的:

class Foo {
  (int, int) bar = (0, 1);
}
Run Code Online (Sandbox Code Playgroud)

或只读:

class Foo {
  readonly (int, int) bar = (0, 1);
}
Run Code Online (Sandbox Code Playgroud)

这种(不变)可变性适用于每个成员。我希望它也能扩展到 const 声明:

class Foo {
  const (int, int) bar = (0, 1);
}
Run Code Online (Sandbox Code Playgroud)

但是这个语句不能编译。在某些情况下,它是不受欢迎的功能,还是只是未实现的功能?

编辑 好的,我现在明白了。我的问题是基于这样一个假设,即 C# 编译器对 ValueTuples 的处理方式与其他类型不同,关于关键字 readonly。所以,如果它已经是一个例外,为什么不为 consts 设置另一个例外。但是,实际上,这种逻辑似乎适用于所有结构体。所以这行不通:

class Foo {
  readonly ExampleStruct field;
  void Method() {
    field.structField = 2;
  }
}
struct ExampleStruct {
  public int structField;
}
Run Code Online (Sandbox Code Playgroud)

c# valuetuple c#-7.3

6
推荐指数
1
解决办法
1803
查看次数