突发奇想 之 古玩中的代码
这是一个早以前的想法了 大概在几个月之前 只是一直没有时间来实现。
我喜欢古玩 说白了就是古董 每次看中央二套的《鉴宝》栏目
每次当主持人说“有请下一位持宝人上场” 的时候 大屏幕上会随机的滚动所有在场的持宝人有中宝物的照片
主持人喊“停” 大屏幕停止滚动 所显示的宝物就是下面要上场的宝物了 最后专家团来为这件宝物鉴定真伪
当时看到这个功能的时候 我的第一反应是利用了随机函数 于是就想抽时间来模拟实现这个功能 但是一直犹豫种种原因
没有来实现 今天下午突然想起了这件事 说做就做。。。
我第一开始的想法是这样的
1.把要显示的宝物图片放在一个指定的文件夹中
2.然后利用 Directory.GetFileSystemEntries(); 方法 遍历 将文件夹中的图片存在数据库中
3.每次程序开始的时候 先获得数据的总条数 然后在这个总条数的范围内 获得随机数作为ID
4.再利用随机数ID 查到对应的数据 显示出来
照着这个步骤做下来 我发现了好几个问题 其中的问题有
1.如果id是不连续的 这下就悲剧了
2.程序在一开始的时候一个操作是 先清空数据表中所有的数据 然后再遍历文件夹 重新添加图片信息 这样是为了对图片操作了以后
得到最新的图片数据 如果这样每次获得ID的最大值和最小值访问数据库次数太多 程序运行太慢
3.每次要获得数据的总个数 也要访问数据库 这样也会造成程序运行过慢
根据以上几个方面的问题 我对程序做了一下修改
1.把要显示的宝物图片放在一个指定的文件夹中
2.然后利用 Directory.GetFileSystemEntries(); 方法 遍历 将文件夹中的图片存在数据库中
3.每次程序开始的时候 只访问一次数据库 将数据库中的内容放在实体对象中 再将对象放在List中 返回List
4.获得List的长度 作为数据的总个数 然后在这个范围内取随机数
5.最后 根据产生的随机数作为List的下标 来访问对应的数据
改进以后 运行的速度明显提高了不少 用户体验提升了不说 内存也优化了不少 真是一举两得呀!!
下面我来说一下我的数据表是怎么设计的吧
ID:我觉得这个字段我就不用说的太多了 说多了也是废话 identity(1,1) primary key
PicPath:这个字段用来保存宝物图片的相对路径(说的是exe程序的相对路径)
PicName:这个字段用来保存宝物的名称 比如说“元代青花瓷花瓶”等
GetBabyPersonName:这个字段用来保存这个宝物的所有者 也就是“持宝人”的称呼
(ps:我见过不少用拼音首字母来命名的字段名 DLXX你知道是什么意思么? 是登陆信息! 天呐 鬼知道原作者是什么意思)
说了思路 说了设计表的设计 现在就该上源代码了吧
别急 我还想补充语句 这个系统我是利用三层模式实现的 听不少人说小程序就不要使用“三层”了 直接访问数据库就得了
我觉得 各有各的好处 在不同的业务中 使用不同的方法 只不过用了“三层” 程序的层次感会强一些
好了 不说了 上源码(只上传UI层的代码和SQL脚本)
public partialclass Form1 : Form
{
BLLbll = new BLL();
PicTabletable = new PicTable();
// 存放数据的总个数
intcount = 0;
// 保存点击了"开始"还是"结束"的状态
intflag = 0;
List<PicTable> lis =newList<PicTable>();
///<summary>
///程序初始化
///</summary>
publicForm1()
{
InitializeComponent();
// 先清空表中所有的数据
bll.DeleteALL();
// 将图片添加到数据库中
AddDataBase();
// 获得所有的数据将数据放在list集合中
lis = bll.GetAllData();
// 获得数据的总条数
count = lis.Count;
}
///<summary>
///点击开始或者结束
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoid btnBigin_Click(objectsender,EventArgs e)
{
if(flag==0)
{
timer.Start();
btnBigin.Text = "停止";
flag = 1;
}
else
{
timer.Stop();
btnBigin.Text = "开始";
flag = 0;
}
}
///<summary>
///计数器不停调用
///</summary>
public void GetRandNumber()
{
// 产生一个在总数据范围内的随机数
Randomr = new Random();
intrandomNum = r.Next(0, count );
// 宝物名称
labBabyName.Text =lis[randomNum].PicName;
// 宝物图片展示
picRes.ImageLocation =lis[randomNum].PicPath;
// 持宝人姓名
labGetBabyName.Text =lis[randomNum].GetBabyPersonName;
}
///<summary>
///计数器调用
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoid timer_Tick(objectsender,EventArgs e)
{
GetRandNumber();
}
///<summary>
///将图片保存到数据库
///</summary>
public void AddDataBase()
{
// 得到pic中的文件读取pic中的所有数据
string[]pics = Directory.GetFileSystemEntries(@"pic");
// 遍历路径取出各个数据并保存在数据库中
for(int i =0;i < pics.Length; i++)
{
string[]tempPath = pics[i].Split('\\','_','.',' ');
// 图片的相对路径
table.PicPath = pics[i];
// 将路径中的宝物名称提取出来
table.PicName = tempPath[1];
// 将路径中的持宝人姓名提取出来
table.GetBabyPersonName =tempPath[2];
// 保存在数据库中
bll.Add(table);
}
}
}
SQL脚本
createtable PicTable
(
id intidentity(1,1)primary key,
PicPath nvarchar(100),
PicName nvarchar(50),
GetBabyPersonName nvarchar(10)
)
界面截图
抽取前初始化
抽取宝物中。。。
抽取宝物后
突发奇想 之 古玩中的代码相关推荐
- 突发奇想:flash+.Net+数据库的一种构思
大家好!我是冯波!一个刚刚学了点编程的小伙子,爱好比较广泛.除了像其它男生那样喜欢踢足球,打篮球以外,自己也非常喜欢军事.什么<孙子兵法与三十六计>啊,<三国演义>啊总是百看不 ...
- shell学习之突发奇想 ^_^ 打印9*9乘法表
国庆放假到今天,<linux命令行和高级shell编程>初步学习到了第十章.基本上一些简单的流程控制脚本我可以编写出来.今天偶然突发奇想,想把 9*9的乘法表打出来.思考了半天,终于有了结 ...
- 需求分析挑战之旅(疯狂的订餐系统)(5)——领导“突发奇想”
摘要: 说教性质的需求分析理论,各位看了也白看,所以咱们就来一个真实个案--"订餐系统"体验一下."订餐系统"貌似简单,但陷阱重重,各种需求分析的经典场景将会一 ...
- 突发奇想把云服务器刷成了黑群晖 ...
大家好,我是鸟哥.一个半路出家的程序员. 前两天准备把自己10年前买的戴尔电脑刷成黑群晖改造成一台家庭存储服务器,折腾了几天后结果把电脑刷成了蓝屏,彻底报废了.后来又突发奇想,准备把手头上的服务器刷成 ...
- 南邮NOJ2063 突发奇想的茂凯
题目描述 扭曲树精茂凯,英勇无畏的他每次战斗之后都会散落一些树枝,怀旧的他都将其收藏了起来,看做是自己胜利的勋章,已知总共收藏了n根树枝,且第i根树枝长为ai. 有一天,茂凯突发奇想--要是从中选出3 ...
- python如何调用文件_如何调用另一个python文件中的代码
原博文 2017-07-10 15:56 − 无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了"hello world"),通常情况下,我们都需要在一个文件中调用另 ...
- 统计java文件中的代码行数
统计Java代码行数工具类 -- CodeCounterUtil.java 统计指定目录下的java文件中代码行数 -- public static int getCodeNumFromFo ...
- 【经验分享】如何优雅的在 Microsoft word中插入代码
目录 一.借助工具 二.使用步骤 三.另辟蹊径 一.借助工具 打开这个网页PlanetB; 就是这个:http://www.planetb.ca/syntax-highlight-word 二.使用步 ...
- 使用webpack打包后,vscode中vue代码变白色的解决办法
使用webpack打包后,vscode中vue代码变白色的解决办法 卸载vetur,重装vetur
最新文章
- 这个40M的小工具助你在windows下处理数据如虎添翼!!
- 谷歌宣布对外开放聊天机器人数据分析平台Chatbase
- ID vs Class 老生常谈的选择器问题
- Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
- handler 消息处理机制
- Python 打开文件注意事项
- 计算机网络信息安全保密制度,档案馆计算机网络系统和信息安全保密制度
- 7、Lctech Pi(F1C200S)开启RNDIS,通过USB与电脑联网(CherryPi,Mangopi,F1C100S)
- 题解 P2919 【[USACO08NOV]守护农场Guarding the Farm】
- 普渡大学科技学院计算机信息技术,普渡大学-学院介绍
- sklearn.metrics.multilabel_confusion_matrix
- Obi - Advanced Rope Simulation 绳索插件学习文档
- airtest获取当前设备序列号,并连接
- 电脑上的计算机里的音乐播放器怎么更改,win10系统电脑中默认的音乐播放器如何修改...
- Adobe Illustrator(ai)导出emf/wmf渐变图片失真色块
- 【无标题】前端电子签名的canvas画板
- vs编译错误:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”?
- 今日份安利:epub格式转换成mobi方法哪个好?
- ChatGPT在企业中的应用
- ArcMap或ArcScene恢复初始化界面设置---彻底解决各种窗口隐藏问题
热门文章
- “左手画圆,右手画方”
- Xilinx 7系列FPGA收发器架构之接收器(RX)(十一)
- 为什存在_tmain以及Unicode和ANSI
- 归一化方法(Normalization Method)
- 小白的25天CTF征程
- mysql-5.7.16安装教程_mysql installer community 5.7.16安装详细教程
- 从控制台输入用户名和密码, 然后 判断输入的用户名是否是@“Frank”, 密码 是否是 @“lanou”, 如果用户名和密码都正确,则输出登录成功, 否则输出登录失败. 提示:
- windows本地git关联远程gitlab仓库
- [Unity Shader] 水纹着色器 Water Shader
- 如何让业务实现三周内实现点击率翻倍?我们是这么做到的...