🐷
C# データベース用サンプルソースコード
C#のデータベースを作成したので、参考用に張り付けとく
設計
今回作成したデータベースの設計は、とてもシンプルである。
id,id結合と
id,name結合の二つによって構成され、これらのリストの組としてデータベースを作成する。
こうすることによって、クラスの保守性と、デバッグ作業の容易さを実現している。
データベースとしては、速度の面で実用に耐えるものではないと思うが、練習用にはいいのではないか。
一応、昇順にIDが並ぶようにはしてあるので、検索のアルゴリズムをクイックソートに変えたら早くなるかもしれません。
id name のデータベースは、基本1つに対して1つのものが返却されるように設計している。リスト型で返すのは、foreachしたときに楽だからである。
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.IO;
using System.Linq;
using System.Diagnostics;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using System.Xml.Linq;
/*
Newtonsoft.Jsonをプロジェクトにインストールします。
NuGetパッケージマネージャーを使用して以下のコマンドを実行します。
Install-Package Newtonsoft.Json
*/
public class id_join
{
public int ID { get; set; }
public int JOIN { get; set; }
}
public class id_name
{
public int ID { get; set; }
public string NAME { get; set; }
}
public class id_joins {
public List<id_join> List { get; set; } = new List<id_join>();
public void Clear() {
List.Clear();
}
public void Add(id_join item)
{
if (item.ID == -1 || item.JOIN == -1)
{
return;
}
id_joinInsertsort insert = new id_joinInsertsort();
insert.f(List, item);
}
public void Remove(id_join item)
{
List.Remove(item);
}
public List<id_join> all_list() {
return List;
}
public int Generate_ID() {
int count = List.Count;
int lastnum = 0;
if (count > 0)
{
lastnum = List[count - 1].ID;
}
else {
return 1;
}
if (lastnum > count)
{
int id = 1;
foreach (id_join item in List)
{
if (item.ID == id)
{
id++;
}
else
{
return id;
}
}
return id;
}
else {
return lastnum + 1;
}
}
public List<id_join> Sertch(int _id, int _join) {
if (_id == -1) {
var findAllList = List.FindAll(el => el.JOIN == _join );
foreach (var item in findAllList)
{
Debug.WriteLine("ID = " + item.ID + "JOIN = " + item.JOIN);
}
return findAllList;
}
if (_join == -1)
{
var findAllList = List.FindAll(el => el.ID == _id);
foreach (var item in findAllList)
{
Debug.WriteLine("ID = " + item.ID + "JOIN = " + item.JOIN);
}
return findAllList;
}
return new List<id_join>() { new id_join { ID = -1, JOIN = -1 }};
}
}
public class id_names
{
public List<id_name> List { get; set; } = new List<id_name>();
public void Clear()
{
List.Clear();
}
public void Add(id_name item)
{
if (item.ID == -1) {
return;
}
id_nameInsertsort insert = new id_nameInsertsort();
insert.f(List, item);
}
public void Remove(id_name item)
{
List.Remove(item);
}
public List<id_name> all_list()
{
return List;
}
public int Generate_ID()
{
int count = List.Count;
int lastnum = 0;
if (count > 0)
{
lastnum = List[count - 1].ID;
}
else
{
return 1;
}
if (lastnum > count)
{
int id = 1;
foreach (id_name item in List)
{
if (item.ID == id)
{
id++;
}
else
{
return id;
}
}
return id;
}
else
{
return lastnum + 1;
}
}
public List<id_name> Sertch(int _id, string _name)
{
if (_id == -1)
{
var findAllList = List.FindAll(el => el.NAME == _name);
foreach (var item in findAllList)
{
Debug.WriteLine("ID = " + item.ID + "NAME = " + item.NAME);
}
return findAllList;
}
if (_name == "")
{
var findAllList = List.FindAll(el => el.ID == _id);
foreach (var item in findAllList)
{
Debug.WriteLine("ID = " + item.ID + "NAME = " + item.NAME);
}
return findAllList;
}
return new List<id_name>() { new id_name { ID = -1, NAME = "" } };
}
}
public class Database
{
/*
構成。まず、ファイル管理用のクラスが二つ、プロジェクト管理用が二つ、タスク用が二つある。
ファイルに対して、複数のプロジェクトを設定でき、プロジェクトに対して、複数のタグを設定できる。
*/
public id_names id_file_path_strage = new id_names();
public id_names id_file_name_strage = new id_names();
public id_joins id_project_id_strage = new id_joins();
public id_names project_id_name_strage = new id_names();
public id_joins project_id_tag_id_strage = new id_joins();
public id_names tag_id_name = new id_names();
}
public class database_Save {
public void f(Database db)
{
string json = JsonConvert.SerializeObject(db, Formatting.Indented);
Debug.WriteLine("Serialized JSON:");
Debug.WriteLine(json);
string filePath = "database.json";
File.WriteAllText(filePath, json);
}
}
public class database_Load {
public void f(Database db)
{
db = new Database();
string filePath = "database.json";
string json = File.ReadAllText(filePath);
// デシリアライズ
db = JsonConvert.DeserializeObject<Database>(json);
Debug.WriteLine("\nDeserialized Object:");
}
}
public class id_nameComparer : IComparer<id_name>
{
public int Compare(id_name x, id_name y)
{
return x.ID.CompareTo(y.ID);
}
}
public class id_nameInsertsort {
public void f(List<id_name> list, id_name newItem)
{
// BinarySearchを使用して挿入位置を特定
int index = list.BinarySearch(newItem, new id_nameComparer());
// BinarySearchの結果が負の場合、ビット反転して挿入位置を取得
if (index < 0)
{
index = ~index;
}
// リストに挿入
list.Insert(index, newItem);
}
}
public class id_joinComparer : IComparer<id_join>
{
public int Compare(id_join x, id_join y)
{
return x.ID.CompareTo(y.ID);
}
}
public class id_joinInsertsort
{
public void f(List<id_join> list, id_join newItem)
{
// BinarySearchを使用して挿入位置を特定
int index = list.BinarySearch(newItem, new id_joinComparer());
// BinarySearchの結果が負の場合、ビット反転して挿入位置を取得
if (index < 0)
{
index = ~index;
}
// リストに挿入
list.Insert(index, newItem);
}
}
以下main
using System.Text.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using static System.Runtime.InteropServices.JavaScript.JSType;
using Newtonsoft.Json.Bson;
namespace DataBase_test1
{
public partial class Form1 : Form
{
Database t_db = new Database();
public Form1()
{
InitializeComponent();
// データベースのインスタンスを作成
id_names i_fna = t_db.id_file_name_strage;
// サンプルデータを追加
add_id_names(i_fna, "20250208");
add_id_names(i_fna, "MarkDownソフト制作における反省点");
id_names pi_na = t_db.project_id_name_strage;
add_id_names(pi_na, "TODO");
add_id_names(pi_na, "日課");
add_id_names(pi_na, "Check");
add_id_names(pi_na, "MarkDown開発");
//
id_joins i_pi = t_db.id_project_id_strage;
add_id_joins(i_pi, i_fna.Sertch(-1, "20250208")[0].ID, pi_na.Sertch(-1, "TODO")[0].ID);
i_pi.Add(new id_join { ID = i_fna.Sertch(-1, "20250208")[0].ID, JOIN = 2 });
i_pi.Add(new id_join { ID = i_fna.Sertch(-1, "20250208")[0].ID, JOIN = 3 });
i_pi.Add(new id_join { ID = i_fna.Sertch(-1, "MarkDownソフト制作における反省点")[0].ID, JOIN = 1 });
i_pi.Add(new id_join { ID = i_fna.Sertch(-1, "MarkDownソフト制作における反省点")[0].ID, JOIN = 4 });
var pi_ti = t_db.project_id_tag_id_strage;
pi_ti.Add(new id_join { ID = 4, JOIN = 1 });
pi_ti.Add(new id_join { ID = 4, JOIN = 2 });
t_db.tag_id_name.Add(new id_name { ID = 1, NAME = "C#" });
t_db.tag_id_name.Add(new id_name { ID = 2, NAME = "個人開発" });
database_Save _d_save = new database_Save();
_d_save.f(t_db);
database_Load _d_load = new database_Load();
_d_load.f(t_db);
//削除処理
int delete_file_num = 2;
i_fna.Remove(i_fna.Sertch(delete_file_num, "")[0]);
Debug.WriteLine("削除後のファイル名一覧");
var file_name_list = i_fna.all_list();
foreach (var f in file_name_list) {
Debug.WriteLine("ID " + f.ID + " NAME " + f.NAME);
}
file_remove(i_pi,pi_ti, delete_file_num);
}
public void file_remove(id_joins i_pi, id_joins pi_ti, int _id) {
var t = i_pi.Sertch(_id, -1);//プロジェクトIDの一覧を取得
foreach (var i in t)
{
var project_to_tag_strage = pi_ti.Sertch(i.JOIN, -1);//タグの一覧を取得
foreach (var ii in project_to_tag_strage)
{
pi_ti.Remove(ii);
}
i_pi.Remove(i);
}
t = i_pi.all_list();
Debug.WriteLine("削除後の内容");
foreach (var i in t)
{
Debug.WriteLine("ID = " + i.ID + " JOIN = " + i.JOIN);
}
t = pi_ti.all_list();
Debug.WriteLine("削除後の内容");
foreach (var i in t)
{
Debug.WriteLine("ID = " + i.ID + " JOIN = " + i.JOIN);
}
}
public void add_id_names(id_names inst,string name) {
inst.Add(new id_name { ID = inst.Generate_ID(), NAME = name });
}
public void add_id_joins(id_joins inst, int i, int j) {
inst.Add(new id_join { ID = i, JOIN = j});
}
}
}
Discussion