标签: valuetuple

何时使用:Tuple vs Class c#7.0

在Tuples之前,我曾经创建一个class及其变量,然后从这个类创建对象,并使该对象成为某些函数的返回类型.

现在用的元组,我可以做同样的在C#7.0,我们可以将元组性质可以理解的名称(这是之前item1,item2等..)

所以现在我想知道,我应该何时使用元组,何时应该在c#7.0中创建一个类?

c# tuples c#-7.0 valuetuple

55
推荐指数
6
解决办法
2万
查看次数

什么使 ValueTuple 协变?

这在 C# 7.3 (Framework 4.8) 中正确编译:

(string, string) s = ("a", "b");
(object, string) o = s;
Run Code Online (Sandbox Code Playgroud)

我知道这是以下内容的语法糖,它也可以正确编译:

ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
Run Code Online (Sandbox Code Playgroud)

所以,看起来 ValueTuples 可以被协变分配,这太棒了

不幸的是,我不明白为什么:我的印象是 C#只支持接口和委托的协变ValueType都不是。

事实上,当我尝试用我自己的代码复制这个功能时,我失败了:

struct MyValueTuple<A, B>
{
    public A Item1;
    public B Item2;

    public MyValueTuple(A item1, B item2)
    {
        Item1 = item1;
        Item2 = item2;
    }
}

...

MyValueTuple<string, string> s = new MyValueTuple<string, string>("a", "b"); …
Run Code Online (Sandbox Code Playgroud)

c# covariance valuetuple

37
推荐指数
1
解决办法
608
查看次数

如何创建ValueTuple列表?

是否可以在C#7中创建ValueTuple列表?

像这样:

List<(int example, string descrpt)> Method()
{
    return Something;
}
Run Code Online (Sandbox Code Playgroud)

c# c#-7.0 valuetuple

23
推荐指数
3
解决办法
2万
查看次数

检查值元组是否为默认值

如何检查System.ValueTuple是否为默认值?粗略的例子:

(string foo, string bar) MyMethod() => default;

// Later
var result = MyMethod();
if (result is default){ } // doesnt work
Run Code Online (Sandbox Code Playgroud)

我可以MyMethod使用defaultC#7.2的语法返回默认值.我无法检查默认情况?这些是我试过的:

result is default
result == default
result is default(string, string)
result == default(string, string)
Run Code Online (Sandbox Code Playgroud)

c# valuetuple c#-7.2

23
推荐指数
4
解决办法
5508
查看次数

ValueTuples在序列化时丢失其属性名称

在尝试将命名值元组序列化为JSON字符串时,它会丢失分配给项目的名称

(string type, string text) myTypes = ("A", "I am an animal");
var cnvValue = JsonConvert.SerializeObject(myTypes);
Run Code Online (Sandbox Code Playgroud)

我期待序列化值为

{"type":"A","text":"我是动物"}

但实际结果是

{"Item1":"A","Item2":"我是动物"}

我有兴趣知道两件事

  • 为什么它会像那样
  • 如何获得预期的输出

c# tuples json.net valuetuple

22
推荐指数
2
解决办法
1390
查看次数

对值类型元组使用`is`运算符会产生错误

我正在尝试检查object变量是否是(int, int),如果可以,我将使用强制类型转换的变量,因此我尝试了以下代码:

//this one gives the error
public void MyMethodWithIs(object val)
{
    if(val is (int id, int name) pair)
    {
        ConsoleWriteLine($"{pair.id}, {pair.name}");
    }
}

//This one works
public void MyMethodWithAs(object val)
{
    var pair = val as (int id, int name)?;
    if(pair!=null)
    {
        ConsoleWriteLine($"{pair.id}, {pair.name}");
    }
}
Run Code Online (Sandbox Code Playgroud)

MyMethodWithIs方法在编辑器中给出以下错误:

找不到适用于类型的合适的解构实例或扩展方法

我的问题

为什么一个工作正常,而另一个却出现错误呢?我认为它MyMethodWithIs更具可读性,适合用于我的案子,但由于出现错误,我无法使用它。

c# valuetuple

18
推荐指数
1
解决办法
529
查看次数

是否可以使用C#7绑定到WPF中的ValueTuple字段

如果我有一个viewmodel属性

public (string Mdf, string MdfPath) MachineDefinition { get; set; }
Run Code Online (Sandbox Code Playgroud)

我尝试在XAML/WPF中绑定它

<Label Content="{Binding Path=MachineDefinition.Item2}" />
Run Code Online (Sandbox Code Playgroud)

要么

<Label  Content="{Binding Path=MachineDefinition.MdfPath}" />
Run Code Online (Sandbox Code Playgroud)

我犯了同样的错误

在此输入图像描述

我看到ValueTuple字段实际上是字段而不是属性.这是问题吗?

c# wpf xaml valuetuple

13
推荐指数
2
解决办法
4862
查看次数

KeyValuePair在C#7中由ValueTuple命名

C#7.0(在VS 2017中)的新功能是否可以将元组字段名称转换为KeyValuePairs?

让我们假设我有这个:

class Entry
{
  public string SomeProperty { get; set; }
}

var allEntries = new Dictionary<int, List<Entry>>();
// adding some keys with some lists of Entry
Run Code Online (Sandbox Code Playgroud)

做一些像这样的事情会很好:

foreach ((int collectionId, List<Entry> entries) in allEntries)
Run Code Online (Sandbox Code Playgroud)

我已经添加System.ValueTuple到项目中了.

能够像这样写它会比这种传统风格好得多:

foreach (var kvp in allEntries)
{
  int collectionId = kvp.Key;
  List<Entry> entries = kvp.Value;
}
Run Code Online (Sandbox Code Playgroud)

c# dictionary c#-7.0 valuetuple

13
推荐指数
1
解决办法
2575
查看次数

C#7中的C#匿名类型是多余的

由于C#7引入了值元组,是否有一个有意义的场景,它们比元组更适合?

例如,以下行

collection.Select((x, i) => (x, i)).Where(y => arr[y.i].f(y.x)).ToArray();
Run Code Online (Sandbox Code Playgroud)

制作以下内容

collection.Select((x, i) => new {x, i}).Where(y => arr[y.i].f(y.x)).ToArray();
Run Code Online (Sandbox Code Playgroud)

多余的.

什么是一个用于更好地使用另一个的用例(出于性能原因或优化)?

显然,如果需要超过六个字段,则不能使用元组,但它是否有一些细微之处呢?

c# anonymous-types compiler-optimization c#-7.0 valuetuple

12
推荐指数
1
解决办法
1016
查看次数

检测对象是否为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
查看次数