利用业余时间为公司的国际化开发一个小工具,功能很简单,但可以重新温习C#的一些经典问题。
1. 两个基本功能
根据源文件和新文件对比,生成对比结果文件。
对比结果要包括:新文件中更改的词条、新加的词条、删除的词条。
输入文件格式:文件开头有些注释,正文的每行由id号、空格、引号围绕的词条三部分。
对比结果文件格式:
实例1:
txt1.txt(源文件)
----------
id1 "a"
id2 "b"
id3 "c"
txt2.txt(新文件)
----------
id1 "a2"
id3 "c"
id4 "d"
生成结果:
result.txt
------------
id1 "a" "a2"
id2 "b" ""
id4 "" "d"
图形界面1
第二个功能是,专门的翻译人员将对比出来变化了的词条的翻译结果存到对比结果文件中,每种语言占据一列。
具体例子就不列了,主要来看C#的一些常见问题。
图形界面2
2.集合类Hashtable的使用
哈希表的简单操作
查找:HashtableObject[key];
在哈希表中添加一个keyvalue键值对:HashtableObject.Add(key,value);
在哈希表中去除某个keyvalue键值对:HashtableObject.Remove(key);
从哈希表中移除所有元素: HashtableObject.Clear();
判断哈希表是否包含特定键key: HashtableObject.Contains(key);
下面控制台程序将包含以上所有操作:
using System;
using System.Collections; file使用Hashtable时,必须引入这个命名空间
class hashtable
{
public static void Main()
{
Hashtable ht=new Hashtable(); file创建一个Hashtable实例
ht.Add(E,e);添加keyvalue键值对
ht.Add(A,a);
ht.Add(C,c);
ht.Add(B,b);
string s=(string)ht[A];
if(ht.Contains(E)) file判断哈希表是否包含特定键,其返回值为true或false
Console.WriteLine(the E keyexist);
ht.Remove(C);移除一个keyvalue键值对
Console.WriteLine(ht[A]);此处输出a
ht.Clear();移除所有元素
Console.WriteLine(ht[A]); file此处将不会有任何输出
}
}
遍历哈希表
遍历哈希表需要用到DictionaryEntry Object,代码如下:
for(DictionaryEntry de in ht) fileht为一个Hashtable实例
{
Console.WriteLine(de.Key);de.Key对应于keyvalue键值对key
Console.WriteLine(de.Value);de.Key对应于keyvalue键值对value
}
3.使用OpenDialog选取文件。
OpenFileDialog ofd = new OpenFileDialog(); // new一个方法
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // 打开文件的默认位置
ofd.ShowDialog(); // 显示打开文件的窗口
fileName = ofd.FileName;// 获得选择的文件路径
textBox1.Text = fileName;
extendedName = Path.GetExtension(fileName); // 文件扩展名
fileName1 = Path.GetFileName(fileName); // 文件名
使用FolderBrowserDialog选取文件夹,选择对比结果文件的保存位置。
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.ShowDialog();
folderName = fbd.SelectedPath; //获得选择的文件夹路径
textBox3.Text = folderName;
4.读写文件
StreamReader sr = new StreamReader(path, Encoding.Default);
string line;
while ((line = sr.ReadLine()) != null)
{
...
}
StreamWriter sw = new StreamWriter(path, true, Encoding.Default); // true to append to existing file
sw.WriteLine(...);
5.using自动关闭文件流
using语句,定义一个范围,在范围结束时处理对象。
场景:
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。
例如:
using(Class1cls1=newClass1(),cls2=newClass1())
这里触发cls1和cls2的Dispose条件是到达using语句末尾或者中途引发了异常并且控制离开了语句块。
如果资源1和资源2的类型不同,则可以用嵌套using的写法
using (StreamWriter sw = new ...)
{
using (StreamReader sr = new ...)
{
...
}
}
6. 在内存中简单的保存一些数据,只需用ListView控件。
如需求2中用户需选择多个目标文件的保存。
注意,添加行时第一列的值要这样添加:item.SubItems[0].Text = ...;
而接下来的其他列要item.SubItems.Add(...);
1privatevoidShowResultTest()
2{
3lvSearchResult.Clear();
4
5//设置listView的显示属性
6lvSearchResult.GridLines=false;
7lvSearchResult.FullRowSelect=true;
8lvSearchResult.View=View.Details;
9lvSearchResult.Scrollable=true;
10lvSearchResult.MultiSelect=false;
11lvSearchResult.HeaderStyle=ColumnHeaderStyle.Nonclickable;
12
13//针对数据库的字段名称,建立与之适应显示表头
14lvSearchResult.Columns.Add("用户呢称",150,HorizontalAlignment.Right);
15lvSearchResult.Columns.Add("移动电话",100,HorizontalAlignment.Left);
16lvSearchResult.Columns.Add("电子邮箱",150,HorizontalAlignment.Left);
17
18//添加列表项
19for(intindex=0;index<5;index++)
20{
21ListViewItemitem=newListViewItem();
22item.SubItems.Clear();
23item.SubItems[0].Text="Name"+index.ToString();
24item.SubItems.Add("Phone"+index.ToString());
25item.SubItems.Add("Email"+index.ToString());
26lvSearchResult.Items.Add(item);
27
28}
29}
删除按钮事件:
foreach(stringfilenameinofd.FileNames)
{
ListViewItemrow =newListViewItem();
row.SubItems[0].Text = (++rowCount).ToString();
row.SubItems.Add(filename);
if(!listTarget.Items.Contains(row))
listTarget.Items.Add(row);
}
7. 退出按钮,程序退出用Application.Exit()。
8. 读取Excel文件
另外我们还要注意一些简单的问题1.excel文件只能存储65535行数据,如果你的数据大于65535行,那么就需要将excel分割存放了。2.关于乱码,这主要是字符设置问题。
8.1.加载Excel(读取excel内容)返回值是一个DataSet
-
//加载Excel
-
publicstaticDataSetLoadDataFromExcel(stringfilePath)
-
{
-
try
-
{
-
stringstrConn;
-
strConn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+filePath+";ExtendedProperties='Excel8.0;HDR=False;IMEX=1'";
-
OleDbConnectionOleConn=newOleDbConnection(strConn);
-
OleConn.Open();
-
Stringsql="SELECT*FROM[Sheet1$]";//可是更改Sheet名称,比如sheet2,等等
-
-
OleDbDataAdapterOleDaExcel=newOleDbDataAdapter(sql,OleConn);
-
DataSetOleDsExcle=newDataSet();
-
OleDaExcel.Fill(OleDsExcle,"Sheet1");
-
OleConn.Close();
-
returnOleDsExcle;
-
}
-
catch(Exceptionerr)
-
{
-
MessageBox.Show("数据绑定Excel失败!失败原因:"+err.Message,"提示信息",
-
MessageBoxButtons.OK,MessageBoxIcon.Information);
-
returnnull;
-
}
-
}
8.2.写入Excel内容,参数:excelTable是要导入excel的一个table表
-
publicstaticboolSaveDataTableToExcel(System.Data.DataTableexcelTable,stringfilePath)
-
{
-
Microsoft.Office.Interop.Excel.Applicationapp=
-
newMicrosoft.Office.Interop.Excel.ApplicationClass();
-
try
-
{
-
app.Visible=false;
-
WorkbookwBook=app.Workbooks.Add(true);
-
WorksheetwSheet=wBook.Worksheets[1]asWorksheet;
-
if(excelTable.Rows.Count>0)
-
{
-
introw=0;
-
row=excelTable.Rows.Count;
-
intcol=excelTable.Columns.Count;
-
for(inti=0;i<row;i++)
-
{
-
for(intj=0;j<col;j++)
-
{
-
stringstr=excelTable.Rows[i][j].ToString();
-
wSheet.Cells[i+2,j+1]=str;
-
}
-
}
-
}
-
-
intsize=excelTable.Columns.Count;
-
for(inti=0;i<size;i++)
-
{
-
wSheet.Cells[1,1+i]=excelTable.Columns[i].ColumnName;
-
}
-
//设置禁止弹出保存和覆盖的询问提示框
-
app.DisplayAlerts=false;
-
app.AlertBeforeOverwriting=false;
-
//保存工作簿
-
wBook.Save();
-
//保存excel文件
-
app.Save(filePath);
-
app.SaveWorkspace(filePath);
-
app.Quit();
-
app=null;
-
returntrue;
-
}
-
catch(Exceptionerr)
-
{
-
MessageBox.Show("导出Excel出错!错误原因:"+err.Message,"提示信息",
-
MessageBoxButtons.OK,MessageBoxIcon.Information);
-
returnfalse;
-
}
-
finally
-
{
-
}
-
}
9. DataSet的遍历方法
C#中的Dataset就像一个数据库,有多个表(Table),一般只有一个表,然后每个表中有行(DataRow)和列(DataColumn),DataRow[DataColumn]可以得到某行某列数据。
foreach (DataTable dt in YourDataset.Tables)
{
foreach (DataRow dr in dt.Rows)
foreach (DataColumn dc in dt.Columns)
Console.WriteLine("{0}, {1}, {2} ", dt.TableName, dc.ColumnName,
dr[dc]);
}
10. 边读边修改文件的方法
创建一个新的临时文件,一边读旧文件,一边将修改结果保存到新的临时文件中。
处理完成后,将临时文件覆盖到旧文件。
只能一行一行读取
然后读取一行改一行
再把改好的每一行存入到另一个文件里
就是说边改边存
全部改好后删除源文件,重命名新文件名为源文件名
11. 总结
实践是最好的温习方式,写一个简单的小工具,就可以重新温习C#一些典型的问题。
再总结起来以供日后查阅,何乐而不为,哈哈!
分享到:
相关推荐
作为一个C#开发为什么要重新学习C++呢?因为在C#在很多业务场景需要调用一些C++编写的COM组件,如果不了解C++,那么,很容易。。。注定是要被C++同事忽悠的。 我在和很多C++开发者沟通的时候,发现他们都有一个非常...
带领大家重温经典
5:一个方法只有在首次运行时才会由于jit造成一定的性能损失,以后对该方法的调用都以本地代码的形式全速运行。 6:方法签名指定了参数的数量(及其顺序),参数的类型;方法是否有返回值,如果有返回值,还要指定...
pythonxml:重温Python的XML工具pythonxml:重温Python的XML工具
使用c#来描述数据结构,大家可以重温基础知识的同时加强对c#的了解
重温微积分》根据作者多年来为各种不同程度的大学生和研究生讲课及讨论班上报告的内容整理而成。第一章对极限理论的发展作了历史的回顾。以下六章分别讨论函数、微分学、积分学、傅里叶分析、实分析与点集拓扑学基础...
重温经典——AVR单片机串口ISP下载器.docx
经典蓝色背景TC2.0,让您重温第一次学习C的...内附一个简单学生信息管理系统(C语言课程设计初级版本,需要拿去用的,稍微修改一下) 和一个 简单木马感染程序(内有很多我自己的小例子,需要从中鉴别出哪个是你要的)
重温微积分 - 齐民友
6.4 创建和终止一个Applet 109 6.5 处理Applet的事件 109 6.6 挂起和恢复Applet 110 6.7 应用程序堆栈和IAppHistory接口 111 6.8 创建自定义通知 112 6.9 小结 112 第七章 创建新的BREW应用程序 113 7.1 写在开发...
同样地,本章也会讨论与最优数量特征有关的其他工具,并了解为什么“有大量的特征却只有很少量的训练样本/观测值”会是一个问题。本章介绍了机器学习从业者使用的最重要工具,目的是能够理解数据,并且使得学习算法...
大师之作,Martin Fowler的持续集成,中文版。持续集成是一种软件开发实践,在实践中项目成员频繁地进行集成,通常每个成员每天都会做集成工作,如此,每天整个项目将会有多次集成。
2020icpc上海(重温经典)(csdn)————程序
重温微积分前四章重排版齐民友.pdf
微积分是科学与技术的基础。 本书对微积分起源、发展,特别是由于需求对微积分发展的推动,进行了重温。
重温老三篇心得体会精选13篇.doc
本项目旨在利用HTML5技术,开发一款具有现代感的吃豆人游戏,让玩家在重温经典的同时,也能体验到新的游戏乐趣。 项目目标: 使用HTML5技术,开发一款具有现代感的吃豆人游戏。 游戏设计简单易上手,同时富有挑战...
在 C#中的委托和事件 一文的后半部分,我向大家讲述了Observer(观察者)...在本文中,我将使用GOF的经典方式,再次实现一遍Observer模式,同时将讲述在 C#中的委托和事件 一文中没有提及的推模式(Push)和拉模式(Pull)。