表示3个值集的最佳方法

Meh*_*diB 8 c# generics associative-array multidimensional-array

假设我有100组3个值.第一个值是时间,第二个值是x位置,第三个值是y位置.例如,这将是一个超过100秒的点的xy位置.我有PHP背景.在PHP中,我会使用这样的3D关联数组:

position["time"]["x"]["y"]
Run Code Online (Sandbox Code Playgroud)

所以我可以在特定时间访问x,y值.你会如何在c#中做到这一点?我认为像列表和字典这样的泛型会做到这一点.但我不知道如何为3D数据集实现键值.

Ehs*_*jad 7

在C#中有类型概念,你需要创建一个具体的自定义类型:struct(值类型)或类(引用类型)

您可以在这种情况下创建一个新类型我正在创建类,如下所示:

public class Position
{
   public DateTime Time {get;set;}
   public int X {get;set;}
   public int Y {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

现在在某个时候你会有一个类位置的实例:

Position postion = new Position(); // object created
positon.Time = DateTime.Now;
position.X = 1;
position.Y =0;
Run Code Online (Sandbox Code Playgroud)

和从中获取值的方式相同:

DateTime time = position.Time;
int positionX = position.X;
int positionY = position.Y;
Run Code Online (Sandbox Code Playgroud)

我建议在这里阅读MSDN的类型基础知识

对于集合部分,我们在C#中提供了Framework提供的集合,其中包括Array,List,可用于保存多个对象Position.

希望能帮助到你!


Jam*_*iec 5

看起来您想要在给定时间访问 x/y 位置。您可以考虑将其他答案与字典结合起来。

定义一个保存 x 和 y 位置的简单结构。重要的是这个对象是不可变的。

public struct Position
{
    public int X { get; }
    public int Y { get; }

    public Position(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以将它们存储在字典中(也许)DateTime作为键。

Dictionary<DateTime, Position> positions = new Dictionary<DateTime, Position>();
positions.Add(new DateTime(2017,3,29,10,0,0), new Position(10,10));
Run Code Online (Sandbox Code Playgroud)

你可以像这样阅读你的立场

var pos = positions[new DateTime(2017,3,29,10,0,0)];
Console.WriteLine("{0}:{1}",pos.X,pos.Y);
Run Code Online (Sandbox Code Playgroud)

对此的一个巧妙的补充是,例如,如果您正在获取您希望按时间查找的这些对象的列表,您可以轻松地将它们变成字典。假设您得到了这些列表(来自其他答案):

public class PositionEntity
{
   public DateTime Time {get;set;}
   public int X {get;set;}
   public int Y {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

作为一个列表,entities你可以这样做:

IEnumerable<PositionEntity> entities = .... loaded from somewhere
var dict = entities.ToDictionary(k => k.Time, v => new Position(v.X,v.Y));
Run Code Online (Sandbox Code Playgroud)