表示3个值集的最佳方法

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

position["time"]["x"]["y"] 

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

看起来您想要在给定时间访问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; } } 

现在,您可以将这些存储在字典中,并使用(可能) DateTime作为键。

 Dictionary positions = new Dictionary(); positions.Add(new DateTime(2017,3,29,10,0,0), new Position(10,10)); 

而且你可以像读取你的位置一样

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

对此的一个简单的补充是,例如,如果您要获得这些对象的列表,您希望按时间查找,您可以轻松地将它们转换为字典。 说你得到这些的列表(从其他答案):

 public class PositionEntity { public DateTime Time {get;set;} public int X {get;set;} public int Y {get;set;} } 

作为列表entities您可以这样做:

 IEnumerable entities = .... loaded from somewhere var dict = entities.ToDictionary(k => k.Time, v => new Position(vX,vY)); 

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

  • 价值类型
  • 参考类型

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

 public class Position { public DateTime Time {get;set;} public int X {get;set;} public int Y {get;set;} } 

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

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

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

 DateTime time = position.Time; int positionX = position.X; int positionY = position.Y; 

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

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

希望能帮助到你!

我建议为此目的定义一个不可变类型,并使用字典来存储值,因为一个对象可以在特定时间在一个地方。

 public class Position { public Position(double x, double y) { X = x; Y = y; } public double X { get; } public double Y { get; } } 

像这样用它:

 var data = new Dictionary(); //add data in two different ways data.Add(TimeSpan.FromMilliseconds(10), new Position(0.1, 1)); data[TimeSpan.FromMilliseconds(15)] = new Position(10, 15); //accessing data var pos = data[TimeSpan.FromMilliseconds(10)]; //check if data exist for specific time if (data.ContainsKey(TimeSpan.FromMilliseconds(15))) { //do what you want } 

你可以使用Tuple类( 参见msdn上的Tuple类 )

 Tuple.Create("time", "x", "y"); //creates a Tuple with 3 elements, aka triple 

一个简单的解决方案可能是使用元组,如果这适合您的需要,例如

 Example: var tuple = Tuple.Create(someBytes, moreBytes, myString); 

您可以使用tuple.Item1,tuple.Item2和tuple.Item3访问这些值。

如果需要,您当然也可以使用多个元组,例如

 var list = new List> { tuple, anotherTuple, thirdTuple, etc }; 

正如其他人所提到的那样,如果您引用“喜欢”数据,则应该创建一个类。

    Interesting Posts