如何创建带嵌套嵌入字段的struct 实现树形层级数据集访问
实现方案
你需要按层级嵌套定义结构体/类,而非将所有字段平铺在同一个结构中,以下提供两种符合需求的实现思路:
方案1:索引式访问实现(易扩展,支持动态调整数据规模)
按数据集→受试者→任务→试验四层嵌套定义结构,代码示例(C#):
// 单次试验结构,存储得分 public struct Trial { public int score; } // 单类任务结构,存储3次试验数据 public struct Task { public Trial[] trial; } // 受试者结构,存储3类任务数据 public struct Subject { public Task[] task; } // 顶层数据集结构,存储10名受试者数据 public struct Dataset { public Subject[] sub; }
初始化示例:
// 初始化完整数据集 Dataset dataset = new Dataset { sub = new Subject[10] }; for (int i = 0; i < 10; i++) { dataset.sub[i] = new Subject { task = new Task[3] }; for (int j = 0; j < 3; j++) { dataset.sub[i].task[j] = new Task { trial = new Trial[3] }; } }
访问方式完全符合你的要求:
// 取第1名受试者、第3类任务(jump)、第2次试验的得分 var variable = dataset.sub[0].task[2].trial[1].score;
方案2:属性名式访问实现(适合固定数据规模的场景)
如果受试者、任务、试验的数量和名称完全固定,可以直接将对应名称定义为属性,实现sub_1.jump.trial_2形式的点访问:
public struct Trial { public int score; } // 试验集合:固定3次试验,属性名对应trial_1~trial_3 public struct TrialCollection { public Trial trial_1; public Trial trial_2; public Trial trial_3; } // 任务集合:固定3类任务,属性名对应walk/run/jump public struct TaskCollection { public TrialCollection walk; public TrialCollection run; public TrialCollection jump; } // 受试者集合:固定10名受试者,属性名对应sub_1~sub_10 public struct Dataset { public TaskCollection sub_1; public TaskCollection sub_2; public TaskCollection sub_3; public TaskCollection sub_4; public TaskCollection sub_5; public TaskCollection sub_6; public TaskCollection sub_7; public TaskCollection sub_8; public TaskCollection sub_9; public TaskCollection sub_10; }
访问方式完全匹配你要求的写法:
var variable = dataset.sub_1.jump.trial_2.score;
其他语言实现思路
如果使用Python,可通过dataclass快速实现嵌套结构,示例如下:
from dataclasses import dataclass, field from typing import List @dataclass class Trial: score: int = 0 @dataclass class Task: trial: List[Trial] = field(default_factory=lambda: [Trial() for _ in range(3)]) @dataclass class Subject: task: List[Task] = field(default_factory=lambda: [Task() for _ in range(3)]) @dataclass class Dataset: sub: List[Subject] = field(default_factory=lambda: [Subject() for _ in range(10)])
内容的提问来源于stack exchange,提问作者Foolvio
相关产品推荐
相关产品推荐

