突发奇想 之 古玩中的代码
来源:互联网 发布:专业英语在线翻译软件 编辑:程序博客网 时间:2024/04/27 17:54
这是一个早以前的想法了 大概在几个月之前 只是一直没有时间来实现。
我喜欢古玩 说白了就是古董 每次看中央二套的《鉴宝》栏目每次当主持人说“有请下一位持宝人上场” 的时候 大屏幕上会随机的滚动所有在场的持宝人有中宝物的照片
主持人喊“停” 大屏幕停止滚动 所显示的宝物就是下面要上场的宝物了 最后专家团来为这件宝物鉴定真伪
当时看到这个功能的时候 我的第一反应是利用了随机函数 于是就想抽时间来模拟实现这个功能 但是一直犹豫种种原因
没有来实现 今天下午突然想起了这件事 说做就做。。。
我第一开始的想法是这样的
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脚本)
publicpartialclass 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脚本
createtablePicTable
(
id intidentity(1,1)primarykey,
PicPath nvarchar(100),
PicName nvarchar(50),
GetBabyPersonName nvarchar(10)
)
界面截图
抽取前初始化
抽取宝物中。。。
抽取宝物后
- 突发奇想 之 古玩中的代码
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想
- 突发奇想,对于a+b问题的一个另类代码。。。
- 突发奇想2
- dup 与 dup2
- 大学思考(转载)
- 《我们为什么会犯错》读书笔记
- 已解决】HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法
- 深入fork
- 突发奇想 之 古玩中的代码
- AT&T汇编语言中提供的基本数据类型:
- rename() 解说
- STL的线程安全性
- ClockGen超强的CPU超频工具
- Linux学习之路
- SQL Server 查询处理中的各个阶段(SQL执行顺序)
- 时间相关 time() ctime time_t localtime() gettimeofday
- mdev.c (1.char,block的区分2.mdev.conf配置文件中=,>)