有没有更好的方法来在 C# 中处理结构数组

本文关键字:处理 结构 数组 更好 方法 有没有 | 更新日期: 2023-09-27 18:37:24

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

有没有更好的方法来在 C# 中处理结构数组

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

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。

一些简短的代码可以是:

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

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

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不会。