본문으로 건너뛰기

행으로 쌓는 배열

시트가 코드가 되는 모습으로


원소 수가 행마다 크게 다르면 컬럼을 최대치만큼 늘어놓는 것이 힘듭니다. 그때는 아래로 쌓습니다.

이름에 [] 를 적으면 그 그룹의 원소는 옆 컬럼이 아니라 아래 행에서 옵니다.

  • 새 레코드의 시작은 기본 인덱스 칸에 값이 있는 행입니다
  • 그 칸이 빈 행은 직전 레코드의 연장 행이고, 거기서 값을 담는 것은 [] 컬럼뿐입니다
  • 완전히 빈 행은 엔티티를 끝냅니다 — 레코드 사이에 빈 행을 둘 수 없습니다

테이블 Quest

[System.Serializable]
public partial class QuestRecord
{
#region Values
/// <summary>
/// primary index
/// </summary>
public int Index => _index;

/// <summary>
/// display name
/// </summary>
public string Name => _name;

/// <summary>
/// an element
/// </summary>
public RewardEntry[] Reward => _reward;
#endregion

/// <summary>One element of <see cref="Reward"/>.</summary>
[System.Serializable]
public struct RewardEntry
{
/// an element
public int Id;
/// an element
public int Count;

public override string ToString()
{
var sb = new StringBuilder("{");
sb.Append("\"Id\":"); ToStringHelper.ToString(Id, sb);
sb.Append(",\"Count\":"); ToStringHelper.ToString(Count, sb);
sb.Append("}");
return sb.ToString();
}
}

#region Storage
internal int _index;
internal string _name = "";
internal RewardEntry[] _reward = System.Array.Empty<RewardEntry>();
#endregion

#region ToString
public override string ToString()
{
var sb = new StringBuilder("{");
sb.Append("\"Index\":"); ToStringHelper.ToString(Index, sb);
sb.Append(",\"Name\":"); ToStringHelper.ToString(Name, sb);
sb.Append(",\"Reward\":"); ToStringHelper.ToString(Reward, sb);
sb.Append("}");
return sb.ToString();
}
#endregion
}

QuestTable.cs

생성된 코드는 컬럼으로 적었을 때와 같습니다. 배열 하나이고, 길이는 그 레코드가 실제로 가진 만큼입니다 — 시트에서 아래로 쌓았다는 사실은 코드에 남지 않습니다.

파일도 같습니다. 같은 데이터를 컬럼으로 적은 시트와 행으로 적은 시트가 바이트 단위로 같은 파일을 만듭니다.