【问题标题】:is there a better way to delare a struct array in c#有没有更好的方法在 c# 中声明一个结构数组
【发布时间】:2013-10-29 00:49:59
【问题描述】:

我必须将来自 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;

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

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

【问题讨论】:

  • 普通的旧 CSV 文件有机会吗?
  • 可以使用一种方法来创建边缘以减少代码行数 Edge CreateEdge(int node1_location, int node2_location, ...) 然后只需 edges[j] = CreateEdge(...)

标签: c# arrays struct


【解决方案1】:

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

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。然后你的 real 程序可以反序列化 XML。

【讨论】:

  • 一个不错的二维数组,可以稍微清除代码,但最好将该代码提取到单独的文件中并保存在一起。
【解决方案2】:

一些简写代码可能是:

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.    
    };

【讨论】:

  • 您甚至可以通过删除括号来缩短更多内容:)
【解决方案3】:

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

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.
};

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多