winforms 哪种方法是存储小型静态表中的数据以便可以轻松访问C# Windows窗体项目中的数据的最佳方法

mjqavswn  于 2022-11-16  发布在  C#
关注(0)|答案(2)|浏览(116)

我正在使用C#处理一个Windows窗体项目,该项目将用于进行计算。
基本上这个项目的目标是取代一个大的Excel电子表格我一直在使用。因为更多的人会使用它,我需要做它的防呆。
我必须做的一个例子:一个comboBox应该显示列名(所以我应该把列名检索到一个IEnumerable列表中)。然后我应该在一个TextBox中插入一个与第一列中的值相对应的值。程序将使用这个值和列名到这个表中,并将相应的值保存到内存中

我将要使用的表大多来自书本,所以我可能永远不会(或不经常)更改这些值。这就是为什么我不使用SQL数据库的原因。我认为这就像去购物中心买一辆法拉利一样。
先谢谢你了

z18hc3ub

z18hc3ub1#

这类数据最简单的存储方式是文本文件:
六、八十、一百二十五
第八章;第一百零七章;第一百六十六章
...
要存储数据,请逐行写入,并以';'.
要读取数据,请逐行读取文件内容(或ReadAllText),然后按';'.

qmelpv7a

qmelpv7a2#

我同意你的观点,SQL数据库对于你的用例来说可能是一个大材小用。
在Excel中,依次按“文件”、“保存为”、“文本”(制表符分隔)。
将该文件移到C#项目中,添加到项目中,然后在Visual Studio中右键单击“属性”,设置“生成操作”=“嵌入资源”。
然后编写一些C#来解析制表符分隔文件中的数据。

sealed class Entry
{
    public readonly double diameter, al, adn;

    Entry( string line )
    {
        string[] fields = line.Split( '\t' );
        if( fields.Length != 3 )
            throw new ArgumentException();
        diameter = double.Parse( fields[ 0 ], CultureInfo.InvariantCulture );
        al = double.Parse( fields[ 1 ], CultureInfo.InvariantCulture );
        adn = double.Parse( fields[ 2 ], CultureInfo.InvariantCulture );
    }

    public static Entry[] loadTabSeparated( Stream stream )
    {
        using var reader = new StreamReader( stream );
        // Ignore the first row with column names
        reader.ReadLine();
        // Parse the rest of the rows in the table
        List<Entry> list = new List<Entry>();
        while( true )
        {
            string? line = reader.ReadLine();
            if( null == line )
                break;
            list.Add( new Entry( line ) );
        }
        return list.ToArray();
    }
}

用法示例:

static Entry[] loadEntries()
{
    const string resourceName = "DefaultNamespace.someData.tsv";
    var ass = Assembly.GetExecutingAssembly();
    using var stm = ass.GetManifestResourceStream( resourceName )
        ?? throw new ApplicationException( "Embedded resource is missing" );
    return Entry.loadTabSeparated( stm );
}

如果文本文件至少有100kb,并且您希望保存二进制文件的大小,请将该资源文件压缩到GZip中。C#代码只需要一行代码就可以动态解压缩,请参见GZipStream类。
此外,由于该数据是不可变的,因此您可能不应该在每次使用时都加载它,而是只加载一次,并在应用运行期间将数组保留在内存中。例如,您可以缓存在某个类的static readonly字段中。

相关问题