LINQ to Enumerable
代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { private static void PrintEnumerable<T>(IEnumerable<T> enumerable) { foreach (var e in enumerable) Console.WriteLine(e); Console.WriteLine("=========="); } static void Main(string[] args) { var MyBooks = new BookCollection(){ {100101,"Harry Potter and the Philosopher's Stone"}, {100102,"Harry Potter and the Chamber of Secrets"}, {100103,"Harry Potter and the Prisoner of Azkaban"}, {100104,"Harry Potter and the Goblet of Fire"}, {100105,"Harry Potter and the Order of the Phoenix"}, {100106,"Harry Potter and the Half-Blood Prince"}, {100107,"Harry Potter and the Deathly Hallows"}, {100108,"The Capture"}, {100109,"The Journey"}, {100110,"The Rescue"}}; Console.WriteLine("The Library"); PrintEnumerable(MyBooks); // 注意 LINQ 的查询结果一般是 IEnumerable<T>。 // IEnumerable<T> 只支持一个方法,那就是 GetEnumerator 。 // 虽然理论上来讲,下面的变量定义都可以使用(而且建议使用) var , // 在此处为了强调期间,均使用了显式的变量类型。 // 排序。 // 注意 LINQ 的查询是延迟执行(Lazy Evaluation)的。具体情况可以参阅 MSDN。 Console.WriteLine("Ordered by Name"); PrintEnumerable(MyBooks.OrderBy(book => book.Name)); // 筛选。 IEnumerable<Book> HarryPotter = MyBooks.Where(book => book.Name.Contains("Harry Potter")); Console.WriteLine("Harry Potter"); PrintEnumerable(HarryPotter); // 投影。 IEnumerable<String> HarryPotterAnd = HarryPotter.Select(book => book.Name.Replace("Harry Potter and the ", "")); Console.WriteLine("Harry Potter And ..."); PrintEnumerable(HarryPotterAnd); // 聚合。 Console.WriteLine("First Book : " + MyBooks.First()); Console.WriteLine("Last Book : " + MyBooks.Last()); Console.WriteLine("Min Id : " + MyBooks.Max(book => book.Id)); Console.WriteLine("Max Id : " + MyBooks.Max(book => book.Id)); // 此处注意,IEnumerable 没有 Count 方法,因此 Count 其实是将所有的元素遍历一遍,然后清点数量的。 // 也就是说,此操作的时间复杂度应该是 O(n),其中 n 是 IEnumerable 中元素的数量。 Console.WriteLine("HarryPotter Books Count : " + HarryPotter.Count()); } } class BookCollection : List<Book> { public void Add(int id, string name) { Add(new Book(id,name)); } } class Book { public int Id { get; set; } public string Name { get; set; } public override string ToString() { return string.Format("[{0}]{1}", Id, Name); } public Book(int id, string name) { Id = id; Name = name; } } }
运行结果如下
The Library [100101]Harry Potter and the Philosopher's Stone [100102]Harry Potter and the Chamber of Secrets [100103]Harry Potter and the Prisoner of Azkaban [100104]Harry Potter and the Goblet of Fire [100105]Harry Potter and the Order of the Phoenix [100106]Harry Potter and the Half-Blood Prince [100107]Harry Potter and the Deathly Hallows [100108]The Capture [100109]The Journey [100110]The Rescue ========== Ordered by Name [100102]Harry Potter and the Chamber of Secrets [100107]Harry Potter and the Deathly Hallows [100104]Harry Potter and the Goblet of Fire [100106]Harry Potter and the Half-Blood Prince [100105]Harry Potter and the Order of the Phoenix [100101]Harry Potter and the Philosopher's Stone [100103]Harry Potter and the Prisoner of Azkaban [100108]The Capture [100109]The Journey [100110]The Rescue ========== Harry Potter [100101]Harry Potter and the Philosopher's Stone [100102]Harry Potter and the Chamber of Secrets [100103]Harry Potter and the Prisoner of Azkaban [100104]Harry Potter and the Goblet of Fire [100105]Harry Potter and the Order of the Phoenix [100106]Harry Potter and the Half-Blood Prince [100107]Harry Potter and the Deathly Hallows ========== Harry Potter And ... Philosopher's Stone Chamber of Secrets Prisoner of Azkaban Goblet of Fire Order of the Phoenix Half-Blood Prince Deathly Hallows ========== First Book : [100101]Harry Potter and the Philosopher's Stone Last Book : [100110]The Rescue Min Id : 100110 Max Id : 100110 HarryPotter Books Count : 7 请按任意键继续. . .
LINQ to XML
使用以下文档
<?xml version="1.0" encoding="utf-8" ?> <!-- 样例 XML --> <!-- 注意:XML中的标识符是区分大小写的。 --> <!-- 注意:XML中的标识符一般采用首字母小写的 Camel 命名法。(如 myIdentifierType) --> <library name="CXs' Library"> <series id="5001" name="Guardians of Ga'Hoole"> <book id="100101" name="The Capture" author="Kathryn Lasky" /> <book id="100102" name="The Journey" author="Kathryn Lasky" /> </series> <series id="5002" name="Harry Potter"> <book id="100201" name="Harry Potter and the Philosopher's Stone" author="J. K. Rowling" /> <book id="100202" name="Harry Potter and the Chamber of Secrets" author="J. K. Rowling" /> </series> <book id="100501" name="Introduction to Algorithms" author="Thomas H. Cormen" /> <book id="100502" name="The Art Of Computer Programming" author="Donald E. Knuth" /> </library>
使用以下代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { static void PrintBook(XElement xBook) { Console.WriteLine("Book : [{0}] {1}, by {2}", (int)xBook.Attribute("id"), (string)xBook.Attribute("name"), (string)xBook.Attribute("author")); } static void Main(string[] args) { var doc = XDocument.Load("XmlFile1.xml"); Console.WriteLine("Root : {0}", doc.Root.Name); // 注意:XML名称是区分大小写的。 Console.WriteLine("Library : {0}", (string)doc.Root.Attribute("name")); // 枚举所有的图书系列。 foreach (var s in doc.Root.Elements("series")) { Console.WriteLine("== Series : [{0}] {1} ==", (int)s.Attribute("id"), (string)s.Attribute("name")); foreach (var book in s.Elements("book")) PrintBook(book); Console.WriteLine("======================="); } // 枚举所有的独立图书。 foreach (var book in doc.Root.Elements("book")) PrintBook(book); } } }
运行结果如下
Root : library Library : CXs' Library == Series : [5001] Guardians of Ga'Hoole == Book : [100101] The Capture, by Kathryn Lasky Book : [100102] The Journey, by Kathryn Lasky ======================= == Series : [5002] Harry Potter == Book : [100201] Harry Potter and the Philosopher's Stone, by J. K. Rowling Book : [100202] Harry Potter and the Chamber of Secrets, by J. K. Rowling ======================= Book : [100501] Introduction to Algorithms, by Thomas H. Cormen Book : [100502] The Art Of Computer Programming, by Donald E. Knuth 请按任意键继续. . .