如何创建一个元组数组?

50

我知道在C#中创建元组的格式是:

Tuple <int,int>from = new Tuple<int,int>(50,350);
Tuple <int,int>to = new Tuple<int,int>(50,650);

每个元组都是一对坐标。我正在尝试使用元组创建多个坐标对的数组。有人可以帮帮我吗?

编辑: 这是我到目前为止尝试过的。我希望它仍然保持这种数组格式。

 Tuple<int, int>[] coords = new Tuple<int,int>({50,350},{50,650},{450,650});

编译器报错了,说明有些问题。请告诉我是哪里出了问题?


1
你可以使用List<Tuple<int, int>>... List是一种通用集合。 - Ahmed ilyas
Tuple<int,int>[] arrayOftuples=new Tuple<int, int>[] {<这里放元组>}. - kravasb
如果你只需要 x 和 y 坐标,为什么不使用 Point 结构体呢?在可读性方面,我会认真考虑使用元组。 - Silvermind
原因是我正在使用一个内置函数,它接受元组数组作为参数。不能改变那个 :-/ - SoulRayder
8个回答

76
在C# 7中
var coords = new[] { ( 50, 350 ), ( 50, 650 ), ( 450, 650 )};

enter image description here

对于指定版本,请执行以下操作:(感谢entiat
var coords2 = new(int X, int Y) [] { (50, 350), (50, 650), (450, 650) };

或者

(int X, int Y) [] coords3 = new [] { (50, 350), (50, 650), (450, 650) };

或者

(int X, int Y) [] coords4 = { (50, 350), (50, 650), (450, 650) };
(int X, int Y) [] coords5 = [ (50, 350), (50, 650), (450, 650) ];

所以我们可以使用X、Y代替Item1、Item2。
coords5.Select(t => $"Area = {t.X * t.Y}");

13
以下是C# 7及以上版本的正确答案。如果你想要命名元素,也可以这样做:var myTupleArray = new (double myFirstItem, int mySecondItem)[] { (12.0, 2), (13.0, 3), (14.0, 4)}; - entiat

43

您可以按如下方式定义:

Tuple<int, int>[] tuples =
{
    Tuple.Create(50, 350),
    Tuple.Create(50, 650),
    ...
};

虽然如果这是坐标值,我可能会使用Point:

Point[] points =
{
    new Point(50, 350),
    new Point(50, 650),
    ...
};

2
这似乎是在这种情况下处理元组需要很多不必要的努力。 - Tobberoth

11

仅此而已

(int x, int y)[] coords = new (int, int)[] {(1, 3), (5, 1), (8, 9)};

8
作为未来回答的参考,请注意以下几点,这将有助于您获得更好的赞同:1. 及时回复(除非答案提供了新的信息);2. 解释答案(提供描述可以让问题提出者和读者理解为什么答案是有价值的)。 - Denis Tsoi
1
除了 @DenisTsoi 的评论 - 我同意他的观点。我还要指出,在C#中,解构只能从C#7.0开始使用。 - Geoff James
1
点赞现代元组。我希望更多人知道它们。是的,你必须拥有C# 7.0,但现在很多人都有了。尽管如此,我认为更多实质性的回答会有很大帮助。 - Jamie

6
您可以这样创建一个数组。您需要初始化每个对。
Tuple<int, int>[] tupleArray = new Tuple<int, int>[10];

tupleArray[0] = new Tuple<int, int>(10,10);

2

只需使用:

Tuple<int, int>[] tupleList =
{
    Tuple.Create(1, 2),
    Tuple.Create(2, 3)
};

甚至更好的是 - 如果您将坐标保存为两个整数对,那么已经有一个结构体可以使用:

Point[] coordinates =
{
    new Point(1, 2),
    new Point(2, 3)
}

1

你可以使用Point代替Tuple

关于数组:

Tuple<int,int>[] aaa = new {Tuple.Create(1, 1),Tuple.Create(1, 1)};

1
如上所述,您打算使用ListDictionary创建符号来创建一个Tuple[],但不构造Tuple[]。对于编译器而言,您可能正在创建KeyValuePair<int,int>数组或JSON数组等其他类型的数组。在您的情况下,没有办法确定要创建的正确类型。
当创建值类型时,您可以通过编译器识别它们并为您新建对象。当传递对象时,您也可以得到允许,因为类型是可识别的。

-1

这就是Bing AI刚刚为我写的。太棒了!

提示:编写一个C#方法,创建一系列名为X和Y的双元组,并将它们添加到集合中,然后将该集合转换为两个双精度数组array-x和array-y。

// Bing says
using System;
using System.Collections.Generic;
using System.Linq;`
 
public class Program
{
    public static void Main()
    {
        // Create a series of tuples of doubles named X and Y
        var tuples = new List<(double X, double Y)>();
        tuples.Add((1.0, 2.0));
        tuples.Add((3.0, 4.0));
        tuples.Add((5.0, 6.0));
        
        // Convert the collection into two arrays of doubles array-x and array-y
        var arrayX = tuples.Select(t => t.X).ToArray();
        var arrayY = tuples.Select(t => t.Y).ToArray();
        
        // Print the arrays for testing
        Console.WriteLine("Array X: " + string.Join(", ", arrayX));
        Console.WriteLine("Array Y: " + string.Join(", ", arrayY));
    }
}

我不确定为什么有人会对此进行负评。我认为我的回答提供了一些被接受的答案没有提到的要点。 1)展示了Bing AI实际上是程序员的一个很好的生产力工具,就像StackOverflow一样。 2)以一种优雅的方式将元组转换为数组。这不是OP问题的一部分,但我正在为接受两个数组的API编写测试数据,并且我发现这是一个干净的解决方案——我可以以清晰的元组方式编写测试数据,然后将数组传递到API中。 - Tom A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接