有没有更好的方法在c#中声明一个struct数组?

时间:2013-10-29 00:50:00

标签: c# arrays struct

我必须将12个节点中的数据放入结构中 我现在就这样做

int j = 0;
edges[j].node1_location = 1;
edges[j].node2_location = 2;
edges[j].isLandWay = true;
edges[j].needToBeChecked = true;
edges[j].weight = 6;

j++;
edges[j].node1_location = 1;
edges[j].node2_location = 3;
edges[j].isLandWay = false;
edges[j].needToBeChecked = true;
edges[j].weight = 1;

但我不喜欢这个 是否有更好的方法(每个节点的数据都是唯一的) 我正在考虑制作一个外部文件,我将数据放入其中并加载。 认为代码会更清洁 disadvantige数据永远不会改变

编辑 谢谢大家的反应 我认为我选择xml或csv文件

3 个答案:

答案 0 :(得分:2)

可能不是很多更干净,但您可以将值编码为数组:

object[][] data = new object[][]
{
    {1, 2, true,  true, 6 },
    {1, 3, false, true, 1 },
...
}

然后只需使用循环来初始化对象:

for(int j = 0; j < data.GetLength(0); j++)
{
    edges[j].node1_location  = (int) data[j,0];
    edges[j].node2_location  = (int) data[j,1];
    edges[j].isLandWay       = (bool)data[j,2];
    edges[j].needToBeChecked = (bool)data[j,3];
    edges[j].weight          = (int) data[j,4];
}

另一种选择是在临时项目中创建数组以将其序列化为XML。然后你的真正的程序就可以反序列化XML。

答案 1 :(得分:1)

一些简写代码可能是:

Edge[] edges = new[]
    {
        new Edge() 
        {
            node1_location = 1,
            node2_location = 2,
            isLandWay = true,
            needToBeChecked = true,
            weight = 6
        },
        new Edge() 
        {
            node1_location = 1,
            node2_location = 3,
            isLandWay = false,
            needToBeChecked = true,
            weight = 1
        },
        // Add more nodes here.    
    };

答案 2 :(得分:0)

如果要为结构定义构造函数,则可以说:

int j = 0;
edges[j++] = new Edge(1, 2, true,  true, 6);
edges[j++] = new Edge(1, 3, false, true, 1);
etc.

Edge edges[] = new edges[] {
  new Edge(1, 2, true,  true, 6),
  new Edge(1, 3, false, true, 1),
  etc.
};

请注意,使用构造函数并不意味着要求将struct字段封装在属性中。如果结构的目的是表现为与管道胶带粘在一起的一堆变量,那么将结构的字段公开是一个明确目的的好方法。如果结构的指定行为允许读取所有字段并使用任何所需的字段值组合创建实例,则这些要求意味着语义等同于公开字段结构,因此可以简单地使用暴露场结构。请注意,所谓的“可变结构”的邪恶涉及结构方法或变异this的属性的问题,而不是那些允许外部代码改变其公共字段的问题。给出:

struct Foo { public int a,b; }
Foo myFoo = computeSomething();

然后myFoo.a的含义只不过是“写入myFoo.a的最后一个值”,或者在这种情况下,“computeSomething存储在字段a中的值返回值。computeSomething()方法可以对该字段中的内容做出一些承诺,但Foo不会。