Posted at

CSVとかマスターデータを特定のKeyでList化してDictionaryで保持する奴

More than 3 years have passed since last update.

https://gist.github.com/enpel/6a763d7191ca40521353


CSVDataHolder.cs


public class CSVDataHolder<T> where T: ICSVData, new()
{
Dictionary<string, List<T>> masterData = new Dictionary<string, List<T>>();
public void Load(string filePath)
{
masterData.Clear();
TextAsset asset = Resources.Load(filePath) as TextAsset;
var text = asset.text;
var lines = text.Split('\n').ToList();

List<T> list = new List<T>();
foreach(var line in lines)
{
T t = new T();
if (t.Parse(line))
{
Debug.Log(t.ToLog());
list.Add(t);
}
}

IEnumerable<string> keys = list.Select(item => item.Key);
foreach(var key in keys)
{
var keyList = list.Where(item => item.Key == key);
if (keyList == null || keyList.Count() == 0)
continue;

masterData[key] = keyList.ToList();
}
}

}



ICSVData.cs

public interface ICSVData

{

string Key { get; } // 分類する用のKey
bool Parse(string line); // パース失敗したらfalse返して!

string ToLog(); // Log用 ToString とかでも可
}


CSVでParseが違うだけであとは殆ど同じ

且つ実際にデータ使う時に特定のKeyで分類されていた方が都合が良い時に

(キャラごとのレベル1〜99の必要経験値をまとめて1つのCSVにしたりする時とかにつかう)

Loadの所とかいろいろやりようあると思うけど最低限これだけあればいいやみたいな感じ