xml,委托

xml文件

可扩展标记性语言,用来保存轻量级数据。

XML的标签是成对出现的、并且是区分大小写的。

XML文档必须包含根节点,且只有一个。

创建XML文件

 1 //创建XML对象
 2 XmlDocument doc = new XmlDocument();
 3 //创建文档描述信息
 4 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
 5 doc.AppendChild(dec);
 6 
 7 //创建根节点
 8 XmlElement books = doc.CreateElement("Books");
 9 doc.AppendChild(books);
10 
11 //创建子节点
12 XmlElement book1 = doc.CreateElement("Book");
13 books.AppendChild(book1); //将子节点添加到books
14 
15 //给book1子节点追加子节点
16 XmlElement name1 = doc.CreateElement("Name");
17 name1.InnerText = "c#"; //赋值 文本值
18 book1.AppendChild(name1);
19 
20 XmlElement price1 = doc.CreateElement("Price");
21 price1.InnerXml = "<b>10.0</b>"; //赋值 html标签
22 book1.AppendChild(price1);
23 
24 XmlElement items = doc.CreateElement("Items");
25 //给节点增加属性
26 items.SetAttribute("Name", "c#");
27 items.SetAttribute("Price", "10.0");
28 book1.AppendChild(items);
29 
30 doc.Save("Books.xml"); //保存
31 
32 //创建后
33 <?xml version="1.0" encoding="utf-8"?>
34 <Books>
35   <Book>
36     <Name>c#</Name>
37     <Price>
38       <b>10.0</b>
39     </Price>
40     <Items Name="c#" Price="10.0" />
41   </Book>
42 </Books>

向已有XML文件中追加

1 XmlDocument doc = new XmlDocument();
2 if (File.Exists("Books.xml"))
3 {
4     doc.Load("Books.xml"); //加载 xml
5     XmlElement books = doc.DocumentElement; //得到根节点
6     //再建立元素进行追加
7 }

获取XML文件

 1 XmlDocument doc = new XmlDocument();
 2 doc.Load("Books.xml");
 3 
 4 XmlElement books = doc.DocumentElement;
 5 XmlNodeList xnl = books.ChildNodes; //得到所有节点
 6 
 7 foreach (XmlNode v in xnl) //遍历得到所有节点值
 8 {
 9     Console.WriteLine(v.InnerText);
10 }
11 
12 XmlNodeList xnl1 = doc.SelectNodes("Books/Book/Items"); //查找节点列表
13 foreach (XmlNode node in xnl1)
14 {
15     Console.WriteLine(node.Attributes["Name"].Value); //得到name属性的值
16     Console.WriteLine(node.Attributes["Price"].Value); //得到price属性的值
17 }

删除XML文件

1 XmlDocument doc = new XmlDocument();
2 doc.Load("Books.xml");
3 
4 XmlNode xnl = doc.SelectSingleNode("Books/Book"); //查找单一节点
5 xnl.RemoveAll(); //删除全部
6 doc.Save("Books.xml");
7 Console.ReadKey();

LinqToXml

 1 //兼容传统方法创建
 2 XDocument xDoc = new XDocument();
 3 //xDoc.Declaration = new XDeclaration() 默认UTF-8 第一行不需要单独建
 4 XElement xRoot = new XElement("root", "值"); //定义元素
 5 
 6 XElement xRoot1 = new XElement("root1");  //定义元素2
 7 xRoot1.Value = "值1";
 8 
 9 XAttribute xattr = new XAttribute("Id", "1"); //定义属性
10 
11 xDoc.Add(xRoot); //统一使用add添加
12 xRoot.Add(xattr);
13 
14 xDoc.Save(@"d:\linqtoxml.xml");
15 
16 //真正的linq语法
17 //F#  函数式编程语言
18 new XDocument(
19     new XElement("root",
20         new XAttribute("id", "001"),
21         "值")
22     ).Save(@"d:\2.xml");
23 //链式编程,流水线生产 f1().f2().f3()...
24 
25 //查找xml
26 XDocument xdoc = new XDocument(new XElement("root"));//根节点
27 xdoc.Root.Add(new XElement("person",
28     new XAttribute("id", "1"),
29     new XAttribute("name", "zhangsan"),
30     new XAttribute("sex", "1")
31     )); //添加子节点
32 xdoc.Root.Add(new XElement("person",
33    new XAttribute("id", "2"),
34    new XAttribute("name", "lisi"),
35    new XAttribute("sex", "2")
36    ));
37 xdoc.Save(@"d:\2.xml");
38 
39 <?xml version="1.0" encoding="utf-8"?>
40 <root>
41   <person id="1" name="zhangsan" sex="1" />
42   <person id="2" name="lisi" sex="2" />
43 </root>
44 
45 //开始查找、修改、删除
46 
47 XDocument xdoc = XDocument.Load(@"d:\2.xml"); //加载xml
48 foreach (XElement xlt in xdoc.Root.Elements()) //Root根节点 Elements 元素集合
49 {
50     if (xlt.Name.LocalName == "person") //Name节点名 LocalName不带命名空间的节点名
51     {
52         if (xlt.Attribute("id").Value == "1") //判断属性值为1时
53         {
54             Response.Write(xlt.Attribute("name").Value); //输出name
55             xlt.Attribute("name").Value = "newname"; //修改name
56             xlt.Remove(); //删除此节点
57             xdoc.Save(@"d:2.xml");
58         }
59     }
60 }
61 
62 //Linq查询语法
63 //Descendants()所有子节点 可加某节点下所有节点
64 var query = from s in xdoc.Descendants() //从集合里找 
65             where s.Name.LocalName == "person"
66             select s;
67 foreach (XElement xlt in query)
68 {
69     Response.Write(xlt.Value);
70 }
71 
72 //Linq方法语法(lambda表达式)
73 foreach (XElement xlt in xdoc.Descendants().Where(s =>
74 {
75     if (s.Name.LocalName == "name")
76     {
77         return true;
78     }
79     return false;
80 }))
81 {
82     Response.Write(xlt.Value);
83 }

委托
使用delegate定义委托,将一个方法作为参数传给另一个方法。
委托所指向的函数必须返回值与参数相同

  1 /// <summary>
  2 /// 委托语法
  3 /// </summary>
  4 class Program
  5 {
  6     public delegate void delSayhi(string name); //定义委托
  7     static void Main(string[] args)
  8     {
  9         delSayhi del = new delSayhi(sayHiChinese); //实例化委托调用具体方法
 10         del("san"); //执行
 11 
 12         delSayhi del1 = sayHiChinese; //直接赋值方式
 13         del1("si");
 14 
 15         //匿名函数
 16         delSayhi del2 = delegate(string name) { Console.WriteLine(name + ",思密达"); };
 17         del2("韩国");
 18 
 19         //lambda表达式  ()没参数也要写 => { //方法体 } 没参数可以e=> Console.WriteLine(""); 如果只有一句话不用{} 返回的return可以省略
 20         delSayhi del3 = (string name) => { Console.WriteLine(name + ",萨瓦迪卡"); };
 21         del2("泰国");
 22 
 23         sayHi("david", sayHiEnglish); //调用自定义方法 参数要调用的方法
 24         Console.ReadKey();
 25     }
 26 
 27     public static void sayHi(string name, delSayhi del) //定义方法 类型委托
 28     {
 29         del(name);
 30     }
 31 
 32     public static void sayHiChinese(string name)
 33     {
 34         Console.WriteLine("你好, 我叫" + name);
 35     }
 36     public static void sayHiEnglish(string name)
 37     {
 38         Console.WriteLine("hello, my name is {0}, nice to meet you!", name);
 39     }
 40 }
 41 
 42 
 43 
 44 /// <summary>
 45 /// 求任意数组最大值
 46 /// </summary>
 47 class Program
 48 {
 49     public delegate int delCompre(object o1, object o2); //定义比较委托
 50     static void Main(string[] args)
 51     {
 52         //比较int
 53         object[] objs = new object[] { 1, 2, 3, 4, 5, 32, 1, 243, };
 54         var max = getMax(objs, getIntMax); //传入比较int方法
 55         Console.WriteLine(max);
 56 
 57         var max2 = getMax(objs, delegate(object o1, object o2)
 58         {
 59             return int.Parse(o1.ToString()) - int.Parse(o2.ToString());
 60         }); //匿名函数 与比较int一样
 61         Console.WriteLine(max2);
 62 
 63         //比较string
 64         object[] strs = new object[] { "abc", "efd", "asdf", "sd", "asdff" };
 65         var maxstrs = getMax(strs, delegate(object o1, object o2)
 66         {
 67             return o1.ToString().Length - o2.ToString().Length;
 68         }); //匿名函数
 69         Console.WriteLine(maxstrs);
 70 
 71         var maxstrs2 = getMax(strs, (object o1, object o2) =>
 72         {
 73             return o1.ToString().Length - o2.ToString().Length;
 74         }); //lambda 表达式
 75         Console.WriteLine(maxstrs2);
 76 
 77         Console.ReadKey();
 78     }
 79 
 80     public static int getIntMax(object o1, object o2) //比较int方法
 81     {
 82         int n1 = int.Parse(o1.ToString());
 83         int n2 = int.Parse(o2.ToString());
 84         return n1 - n2;
 85     }
 86     /// <summary>
 87     /// 取一个任意数组的最大值
 88     /// </summary>
 89     /// <param name="objs">数组</param>
 90     /// <param name="del">委托</param>
 91     /// <returns></returns>
 92     public static object getMax(object[] objs, delCompre del)
 93     {
 94         object max = objs[0];
 95         for (int i = 0; i < objs.Length; i++)
 96         {
 97             //if (max < objs[i]) object 无法确定是什么类型 所以不能用<
 98             if (del(max, objs[i]) < 0) //如果委托值小于0 成立 传入如何比较即可
 99             {
100                 max = objs[i];
101             }
102         }
103         return max;
104     }
105 }
106 
107 
108 /// <summary>
109 /// 泛型<T>委托
110 /// </summary>
111 class Program
112 {
113     public delegate int delCompre<T>(T t1, T t2); //定义泛型委托
114     static void Main(string[] args)
115     {
116         //int
117         int[] nums = { 1, 2, 3, 4, 5 };
118         int max = getMax<int>(nums, (int t1, int t2) => { return t1 - t2; });
119         Console.WriteLine(max);
120 
121         //string
122         string[] strs = { "asd", "sdf", "zxcvv", "123", "qwe" };
123         string maxStr = getMax(strs, (string s1, string s2) => { return s1.Length - s2.Length; });
124         Console.WriteLine(maxStr);
125 
126         Console.ReadKey();
127     }
128 
129     public static T getMax<T>(T[] objs, delCompre<T> del)
130     {
131         T max = objs[0];
132         for (int i = 0; i < objs.Length; i++)
133         {
134             if (del(max, objs[i]) < 0)
135             {
136                 max = objs[i];
137             }
138         }
139         return max;
140     }
141 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值