表示3个值的集合的最佳方式

时间:2017-03-29 09:14:40

标签: c# generics multidimensional-array associative-array

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

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

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

5 个答案:

答案 0 :(得分:7)

在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;

我建议阅读from MSDN here

类型的基础知识

对于集合部分,我们在C#中提供了框架提供的集合,其中包含ArrayList,可用于保存Position的多个对象。

希望它有所帮助!

答案 1 :(得分:4)

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

定义一个包含x&的简单结构。我的职位。重要的是这个对象是不可变的。

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<DateTime, Position> positions = new Dictionary<DateTime, Position>();
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<PositionEntity> entities = .... loaded from somewhere
var dict = entities.ToDictionary(k => k.Time, v => new Position(v.X,v.Y));

答案 2 :(得分:3)

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

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<TimeSpan, Position>();

//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
}

答案 3 :(得分:0)

您可以使用import numpy as np probs = [1/30.]*10 + [1/(3*26.)]*52 ent = -np.sum(probs*np.log(probs)) 班级(See Tuple class on msdn

Tuple

答案 4 :(得分:-1)

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

Example:

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

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

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

实施例

var list = new List<Tuple<byte, byte, string>> {
    tuple,
    anotherTuple,
    thirdTuple,
    etc
};

正如其他人所提到的那样,如果您引用&#34;喜欢&#34;数据,你应该创建一个类。