C#学习随笔

目录

C#的集合类:ArrayList、Queue、Stack、Hashtable、SortedList、Dictionary. 1

C#中post和get提交... 6

Response.AddHeader. 6

Request   c#如何获取当前页?. 7

C# DataTable的詳細用法... 8

Environment.TickCount. 12

 

C#的集合类:ArrayList、Queue、Stack、Hashtable、SortedList、Dictionary

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

一、ArrayList 类:使用大小可按需动态增加的数组。

            ArrayList al = new ArrayList();
            al.Add(100);//单个添加
            foreach (int number in new int[6] { 937248 })
            {
                al.Add(number);//集体添加方法一
            }
            int[] number2 = new int[2] { 1112 };
            al.AddRange(number2);//集体添加方法二
            al.Remove(3);//移除值为3
            al.RemoveAt(3);//移除第3
            ArrayList al2 = new ArrayList(al.GetRange(13));//ArrayList只取旧ArrayList一部份
            Console.WriteLine("遍历方法一:");
            foreach (int i in al)//不要强制转换
            {
                Console.WriteLine(i);//遍历方法一
            }

            Console.WriteLine("遍历方法二:");
            for (int i = 0; i < al2.Count; i++)//数组是length
            {
                int number = (int)al2[i];//一定要强制转换
                Console.WriteLine(number);//遍历方法二
            }
二、Queue:队列,表示对象的先进先出集合。Enqueue方法入队列,Dequeue方法出队列。

            Queue qu = new Queue();
            Queue qu2 = new Queue();
            foreach (int i in new int[4] { 1234 })
            {
                qu.Enqueue(i);//入队
                qu2.Enqueue(i);
            }
           foreach (int i in qu)
            {
                Console.WriteLine(i);//遍历
            }
            qu.Dequeue();//出队
            Console.WriteLine("Dequeue");
            foreach (int i in qu)
            {
                Console.WriteLine(i);
            }

            qu2.Peek();//返回位于 Queue 开始处的对象但不将其移除。
            Console.WriteLine("Peek");
            foreach (int i in qu2)
            {
                Console.WriteLine(i);
            }
三、Stack:栈,表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈。

            Stack sk = new Stack();
            Stack sk2 = new Stack();
            foreach (int i in new int[4] { 1234 })
            {
                sk.Push(i);//入栈
                sk2.Push(i);
            }
            foreach (int i in sk)
            {
                Console.WriteLine(i);//遍历
            }
            sk.Pop();//出栈
            Console.WriteLine("Pop");
            foreach (int i in sk)
            {
                Console.WriteLine(i);
            }
            sk2.Peek();//弹出最后一项不删除
            Console.WriteLine("Peek");
            foreach (int i in sk2)
            {
                Console.WriteLine(i);
            }

四、哈希表(Hashtable)

     Hashtable用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtablekey/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.
  
添加一个key/value键值对:HashtableObject.Add(key,value);
  
去除某个key/value键值对:HashtableObject.Remove(key);
  
移除所有元素:           HashtableObject.Clear();
  
是否包含特定键key      HashtableObject.Contains(key);

     Hashtable ht=new Hashtable(); //创建一个Hashtable实例
     ht.Add("E","e");//添加key/value键值对
     ht.Add("A","a");
     
string s=(string)ht["A"];
     
if(ht.Contains("E")) //判断哈希表是否包含特定键,其返回值为truefalse
       Console.WriteLine("the E key:exist");
     ht.Remove(
"C");//移除一个key/value键值对
     Console.WriteLine(ht["A"]);//此处输出a
     ht.Clear();//移除所有元素
     Console.WriteLine(ht["A"]); //此处将不会有任何输出

遍历哈希表需要用到DictionaryEntry Object,代码如下:
for(DictionaryEntry de in ht) //ht为一个Hashtable实例
{
    Console.WriteLine(de.Key);
//de.Key对应于key/value键值对key
    Console.WriteLine(de.Value);//de.Key对应于key/value键值对value
}
     
对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:

ArrayList akeys=new ArrayList(ht.Keys); //别忘了导入System.Collections
akeys.Sort(); //按字母顺序进行排序
foreach(string skey in akeys)
{
    Console.Write(skey + ":");
    Console.WriteLine(ht[skey]);//排序后输出
}

五、SortedList类:表示键/值对的集合,与哈希表类似,区别在于SortedList中的Key数组排好序的。

            SortedList sl = new SortedList();
            sl["c"] = 41;
            sl["a"] = 42;
            foreach (DictionaryEntry element in sl)
            {
                string s = (string)element.Key;
                int i = (int)element.Value;
                Console.WriteLine("{0},{1}", s, i);
            }
六、Dictionary 泛型集合

    泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。
    
很多非泛型集合类都有对应的泛型集合类:rrayList,List;HashTable,DIctionary;Queue,Queue;

Stack,Stack;SortedList,SortedList

 Dictionary<stringstring> myDic = new Dictionary<stringstring>();
    myDic.Add("aaa""111");
    myDic.Add("bbb""222");
    myDic.Add("ccc""333");
    myDic.Add("ddd""444");
    //如果添加已经存在的键,add方法会抛出异常
    try
    {
        myDic.Add("ddd","ddd");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine("此键已经存在:" + ex.Message);
    }
    //解决add()异常的方法是用ContainsKey()方法来判断键是否存在
    if (!myDic.ContainsKey("ddd"))
    {
        myDic.Add("ddd""ddd");
    }
    else
    {
        Console.WriteLine("此键已经存在:");
    }
    //而使用索引器来负值时,如果建已经存在,就会修改已有的键的键值,而不会抛出异常
    myDic ["ddd"]="ddd";
    myDic["eee"] = "555";
    //使用索引器来取值时,如果键不存在就会引发异常
    try
    {
        Console.WriteLine("不存在的键\"fff\"的键值为:" + myDic["fff"]);
    }
    catch (KeyNotFoundException ex)
    {
        Console.WriteLine("没有找到键引发异常:" + ex.Message);
    }
    //解决上面的异常的方法是使用ContarnsKey() 来判断时候存在键,如果经常要取健值得化最好用 TryGetValue方法来获取集合中的对应键值
    string value = "";
    if (myDic.TryGetValue("fff"out value))
    {
        Console.WriteLine("不存在的键\"fff\"的键值为:" + value );
    }
    else
    {     
        Console.WriteLine("没有找到对应键的键值"); 
    }
     //下面用foreach 来遍历键值对
    //
泛型结构体 用来存储健值对
    foreach (KeyValuePair<stringstring> kvp in myDic)
    {
        Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
    }
    //获取值得集合
    foreach (string s in myDic.Values)
    {
        Console.WriteLine("value={0}", s);
    }
    //获取值得另一种方式
    Dictionary<stringstring>.ValueCollection values = myDic.Values;
    foreach (string s in values)
    {
        Console.WriteLine("value={0}", s);
    }

 

 

C#postget提交

提交时:对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
1
post安全性比get好,包含机密信息的话,建议用Post数据提交方式;
2
、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

 

C#中post和get提交的可以通过 Request["Test"]获取到数据,而Request.Form["Test"]值能获取到post提交的数据;Request.QueryString值能获取get提交的数据,实验过。

Response.AddHeader

文件下载,指定默认名
Response.AddHeader("content-type","application/x-msdownload");// 限制类型
Response.AddHeader("Content-Disposition","attachment;filename=文件名.rar");// 下载后的文件名

2.刷新页面
Response.AddHeader (“REFRESH”,”60;URL=newpath/newpage.asp”)
这等同于客户机端元素:


3.页面转向
Response.Status = “302 Object Moved”
Response.Addheader “Location”,“newpath/newpage.asp”
这等同于使用Response.Redirect方法:
Response.Redirect “newpath/newpage.asp”

4.强制浏览器显示一个用户名/口令对话框
Response.Status= “401 Unauthorized”
Response.Addheader “WWW-Authenticate”, “BASIC”
强制浏览器显示一个用户名/口令对话框,然后使用BASIC验证把它们发送回服务器(将在本书后续部分看到验证方法)。

5.如何让网页不缓冲
Response.Expires = 0
Response.ExpiresAbsolute = Now() - 1
Response.Addheader"pragma","no-cache"
Response.Addheader"cache-control","private"
Response.CacheControl = "no-cache

 

 

 

Request   c#如何获取当前页?

正确的方法是:HttpContext.Current.Request.Url.PathAndQuery1、通过ASP.NET获取
如果测试的url地址是http://www.test.com/testweb/default.aspx,结果如下:
Request.ApplicationPath:               /testweb
Request.CurrentExecutionFilePath:      /testweb/default.aspx
Request.FilePath:                       /testweb/default.aspx
Request.Path:                          /testweb/default.aspx
Request.PhysicalApplicationPath:         E:\WWW\testweb\default.aspx
Request.RawUrl:                        /testweb/default.aspx
Request.Url.AbsolutePath:               /testweb/default.aspx
Request.Url.AbsoluteUrl:               
http://www.test.com/testweb/default.aspx
Request.Url.Host:                      
www.test.com
Request.Url.LocalPath:                 /testweb/default.aspx

 

Cache-control”常见的取值有privateno-cachemax-agemust-revalidate

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据不同的重新浏览方式分为以下几种情况:
(1) 打开新窗口
如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:
Cache-control: max-age=5
表示当访问此网页后的5秒内再次访问不会去服务器
(2) 在地址栏回车
如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
(3) 按后退按扭
如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问
(4) 按刷新按扭
无论为何值,都会重复访问

当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。
另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问:
Expires: Fri, 31 Dec 1999 16:00:00 GMT

在ASP中,可以通过Response对象的Expires、ExpiresAbsolute属性控制Expires值;通过Response对象的CacheControl属性控制Cache-control的值,例如:
Response.ExpiresAbsolute = #2000-1-1# ' 指定绝对的过期时间,这个时间用的是服务器当地时间,会被自动转换为GMT时间
Response.Expires = 20  ' 指定相对的过期时间,以分钟为单位,表示从当前时间起过多少分钟过期。
Response.CacheControl = "no-cache"

 

 

301跳转的原理:
根据HTTP协议,客户端向服务器发出请求,服务器返回数据应答头中状态码为301,表示永久转移到loction字段中的URL

首先判断Request对象以及Request.Url是否为空再将Request.Url转换为字符串,判断最后一个字符是否为“/”不是则在Request.Url后面加上“/”进行301跳转到指定页面同事不让本地有缓存

 

 

 

 

 

C# DataTable的詳細用法

在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结。 

        一、DataTable简介    

          (1)构造函数 
          DataTable()   
不带参数初始化DataTable 类的新实例。 
          DataTable(stringtableName)  
用指定的表名初始化DataTable 类的新实例。 
          DataTable(stringtableName, string tableNamespace) 
用指定的表名和命名空间初始化DataTable类的新实例。 
          (2) 
常用属性 
          CaseSensitive    
指示表中的字符串比较是否区分大小写。 
          ChildRelations   
获取此DataTable 的子关系的集合。 
          Columns             
获取属于该表的列的集合。 
          Constraints        
获取由该表维护的约束的集合。 
          DataSet               
获取此表所属的DataSet 
          DefaultView       
获取可能包括筛选视图或游标位置的表的自定义视图。 
          HasErrors          
获取一个值,该值指示该表所属的DataSet 的任何表的任何行中是否有错误。 
          MinimumCapacity  
获取或设置该表最初的起始大小。该表中行的最初起始大小。默认值为 50 
          Rows                  
获取属于该表的行的集合。 
          TableName       
获取或设置DataTable 的名称。 

          (3)常用方法 
          AcceptChanges()   
提交自上次调用AcceptChanges() 以来对该表进行的所有更改。 
          BeginInit()         
开始初始化在窗体上使用或由另一个组件使用的DataTable。初始化发生在运行时。

          Clear()               清除所有数据的DataTable 
          Clone()              
克隆DataTable 的结构,包括所有DataTable 架构和约束。 
          EndInit()            
结束在窗体上使用或由另一个组件使用的DataTable 的初始化。初始化发生在运行时。 
          ImportRow(DataRow row)    
DataRow 复制到DataTable 中,保留任何属性设置以及初始值和当前值。 
          Merge(DataTabletable)  
将指定的DataTable 与当前的DataTable 合并。 
          NewRow()         
创建与该表具有相同架构的新DataRow
 
        
二、DataTable使用技巧

      1Createa DataTable
         DataTable dt = new DataTable("Table_AX"); 

      2Addcolumns for DataTable
        //Method 1
        dt.Columns.Add("column0",System.Type.GetType("System.String"));
        //Method 2
        DataColumn dc = newDataColumn("column1", System.Type.GetType("System.Boolean"));
        dt.Columns.Add(dc); 

       
3Addrows for DataTable
         //Initialize the row
         DataRow dr = dt.NewRow();
         dr["column0"] ="AX";
         dr["column1"] =true;
         dt.Rows.Add(dr);
         //Doesn't initialize the row
         DataRow dr1 = dt.NewRow();
         dt.Rows.Add(dr1);  

        4Select row
         //Search the second row 
如果没有赋值,则用is nullselect
         DataRow[] drs =dt.Select("column1 is null");
         DataRow[] drss =dt.Select("column0 = 'AX'"); 

        5Copy DataTable include data
         DataTable dtNew =dt.Copy(); 

        
6CopyDataTable only scheme
         DataTable dtOnlyScheme =dt.Clone(); 

        
7Operateone row
         //
dt的操作
         //Method 1
         DataRow drOperate =dt.Rows[0];
         drOperate["column0"]= "AXzhz";
         drOperate["column1"]= false;
         //Method 2
         drOperate[0] ="AXzhz";
         drOperate[1] = false;
         //Method 3
        dt.Rows[0]["column0"] = "AXzhz";
         dt.Rows[0]["column1"]= false;
         //Method 4
         dt.Rows[0][0] ="AXzhz";
         dt.Rows[0][1] = false; 

       
8Evaluateanother DataTable's row to current Datatable
        dtOnlyScheme.Rows.Add(dt.Rows[0].ItemArray); 

       
9Convertto string
         System.IO.StringWriter sw =new System.IO.StringWriter();
         System.Xml.XmlTextWriter xw =new System.Xml.XmlTextWriter(sw);
         dt.WriteXml(xw);
         string s = sw.ToString();

        
10FilterDataTable
         dt.DefaultView.RowFilter ="column1 <> true";
         dt.DefaultView.RowFilter ="column1 = true";

        
11Sortrow
          dt.DefaultView.Sort ="ID ,Name ASC";
         dt=dt.DefaultView.ToTable();

         
12Bind DataTable
           //
绑定的其实是DefaultView
         gvTestDataTable.DataSource = dt;
         gvTestDataTable.DataBind();

         
13judge the DataTables Column name is a string
          //
判断一个字符串是否为DataTable的列名
        dtInfo.Columns.Contains("AX");

         
14DataTable convert to XML and XML convert to DataTable
          protected voidPage_Load(object sender, EventArgs e)
          {
            DataTable dt_AX = new DataTable();
            //dt_AX.Columns.Add("Sex", typeof(System.Boolean));
            //DataRow dr = dt_AX.NewRow();
            //dr["Sex"] = true;
            //dt_AX.Rows.Add(dr);
             stringxml=ConvertBetweenDataTableAndXML_AX(dt_AX);
            DataTable dt = ConvertBetweenDataTableAndXML_AX(xml);
         }
         public string ConvertBetweenDataTableAndXML_AX(DataTabledtNeedCoveret)
        {
            System.IO.TextWriter tw = new System.IO.StringWriter();
             //ifTableName is empty, WriteXml() will throwException.                 

dtNeedCoveret.TableName=dtNeedCoveret.TableName.Length==0?"Table_AX":dtNeedCoveret.TableName;
            dtNeedCoveret.WriteXml(tw);
            dtNeedCoveret.WriteXmlSchema(tw);
             returntw.ToString();
        }
         public DataTableConvertBetweenDataTableAndXML_AX(string xml)
        {
            System.IO.TextReader trDataTable = new System.IO.StringReader(xml.Substring(0,xml.IndexOf("             System.IO.TextReader trSchema = newSystem.IO.StringReader(xml.Substring(xml.IndexOf("             DataTable dtReturn = new DataTable();
            dtReturn.ReadXmlSchema(trSchema);
            dtReturn.ReadXml(trDataTable);
             returndtReturn;
        }

 

 

Environment.TickCount

本次开机以来系统连续运行的时间。

该属性的值从系统计时器派生,并以 32 位有符号整数的形式存储。因此,如果系统连续运行,TickCount 将在约 24.9 天内从零递增至 Int32.MaxValue,然后跳至 Int32.MinValue(这是一个负数),再在接下来的 24.9 天内递增至零。 TickCount 属性的分辨率不能小于 500 毫秒。 TickCount 不同于 Ticks 属性,后者是自 1/1/0001 中午 12:00 以后经过的 100 毫微秒间隔数。

 

你可能感兴趣的:(C#学习随笔)