🐷

C# データベース用サンプルソースコード

2025/02/08に公開

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