mmkk的.NET空间

May 15, 2008

关注灾区, 我们的心在一起!

Filed under: 杂谈 — jameslv @ 10:20 pm

320.gif

LINQ口袋书读书笔记22

Filed under: LINQ — jameslv @ 10:15 pm

LINQ to XML

.NET Framework提供了大量的API用于处理XML数据. 从Framework 3.5开始, 对于处理常规XML文档的第一选择将是LINQ to XML. LINQ to XML包含一个轻量级的LINQ友好的XML文档对象模型, 以及一系列附加的查询操作符. 在多数场景中, 它可以被当中是先前的W3C兼容的DOM模型的替换(即XmlDocument). LINQ to XML DOM设计极其优良并且可以高效执行. 即使没有LINQ, LINQ to XML DOM作为对低级XmlReader和XmlWriter的门面(Facade)包装也是非常有价值的.

所有的LINQ to XML类型都定义在System.Xml.Linq命名空间下.

架构概貌

考虑以下的XML文件

   1: <?xml version="1.0" encoding="utf-8" standalone="yes"?>
   2: <customer id="123" status="archived">
   3:   <firstname>Joe</firstname>
   4:   <lastname>Bloggs</lastname>
   5: </customer>

对于所有的XML文件, 我们首先定义一个声明, 然后定义一个root元素, 它的名称是customer. customer元素包含有两个属性, 并各自有名称(id和status)以及对应值("123"和"archived"). customer还拥有两个子元素, firstName和lastName, 它们还包含了各自的简单文本内容("Joe"和"Bloggs").

所有的这些构件–声明,元素,属性,值以及文本内容, 都可以用一个类来展现. 如果这样的一个类型拥有集合属性来存储子内容的话, 我们可以聚合一棵对象树来描述一个文档. 这被称为文档对象模型, 即DOM.

LINQ to XML包含两个内容:

  1. 一个XML DOM, 我们称它为X-DOM
  2. 一系列附加的查询操作符

正如你可能期待的那样, X-DOM的组成类型包括像XDocument, XElement以及XAttribute. 有趣的是, X-DOM的类型并不依赖于LINQ–在没有编写任何LINQ查询的情况下你依然可以加载, 实例化, 更新以及保存一个X-DOM.

相反的, 你能够使用LINQ去查询一个DOM并创建一个老式的W3C兼容的类型. 然而, 过程可能会令人沮丧并且会有一定的限制. 一个区别(与W3C DOM比)的特征是XDOM是LINQ友好的, 这意味着:

  • 它拥有一些方法去处理IEnumerable序列
  • 可以通过LINQ去构建一棵XDOM对象树

待续!

LINQ口袋书读书笔记21

Filed under: LINQ — jameslv @ 10:03 pm

创建方法

方法 描述
Empty 创建一个空序列
Repeat 创建一个包含重复元素的序列
Range 创建一个包含整数的序列

Empty, Repeat和Range都是静态方法, 用于加工简单的本地序列

Empty

Empty制造一个空序列并且只需要一个类型参数:

   1: foreach (string s in Enumerable.Empty<string>())
   2:   Console.Write(s);            // <nothing>

与??操作符联合, Empty可以完成和DefaultIfEmpty相反的工作. 例如, 假设我们有一个锯齿形状的整型数组, 并且我们希望能够将所有的整数放入到一个扁平的列表当中. 以下的SelectMany将会失败因为输入序列包含了null的内部数组:

   1: int[][] numbers =
   2: {
   3:   new int[] { 1, 2, 3 },
   4:   new int[] { 4, 5, 6 },
   5:   null          // null会导致查询失败.
   6: };
   7:  
   8: IEnumerable<int> flat =
   9:   numbers.SelectMany (innerArray =>innerArray);

Empty联合??操作符可以修正此问题:

   1: IEnumerable<int> flat = numbers
   2:   .SelectMany (innerArray =>
   3:                innerArray ?? Enumerable.Empty <int>() );
   4:  
   5: foreach (int i in flat)
   6:   Console.Write (i + " ");      // 1 2 3 4 5 6

Range和Repeat

Range和Repeat只能与整数一起工作. Range接受一个起始索引和取值总数:

   1: foreach (int i in Enumerable.Range (5,5))
   2:   Console.Write (i + " ");                 // 5 6 7 8 9

Repeat接受一个接受重复的数字以及要重复的次数的参数:

   1: foreach (int i in Enumerable.Repeat (5,3))
   2:   Console.Write (i + " ");                 // 5 5 5

待续!

May 14, 2008

Live Writer首个Post

Filed under: 杂谈 — jameslv @ 7:47 pm

试试看效果如何!~ 貌似效果还不错, 可惜不知道为什么, Writer的plug-in网站我一直没有办法访问, 需要弄一个能够方便编辑代码的插件才行!

   1: public static void AddNew(ClaimRequestCommon.Model.ClaimRequest cr)
   2: {
   3:     using (ClaimRequestDataContext dc = new ClaimRequestDataContext())
   4:     {
   5:         dc.ClaimRequests.InsertOnSubmit(cr);
   6:         dc.SubmitChanges();
   7:     }
   8: }

终于载到了, 效果的确是不错, 以后就用它了.!~

May 11, 2008

LINQ 口袋书读书笔记 20

Filed under: LINQ — jameslv @ 12:35 pm

量词

Contains: 如果输入序列包含给定元素则返回true, 对应SQL语法为WHERE…IN

Any: 如果有任何的元素满足给定的断言判定则返回true, 对应SQL语法为WHERE…IN

All: 如果所有的元素都满足给定的断言判定则返回true, 对应SQL语法为WHERE

SequenceEqual: 如果第二个序列包含与输入序列等同的元素则返回true

ContainsAny

Contains方法接受一个类型为TSource的参数, Any接受一个可选的断言(predicate), 如果输入序列包含有给定的元素则Contains返回true:

bool isTrue = new int[] { 23, 34, 4}.Contains (4);

对于Any, 如果表达式能够匹配到至少一个元素, 则返回true, 我们可以用Any重写前面的例子:

bool isTrue = new int[] { 23, 34, 4 }.Any (n => n == 4);

Any可以完成Contains能够的所有事情, 而且可以做得更多:

bool isFalse = new int[] { 23, 34, 4 }.Any (n => n > 50);

调用Any的时候, 如果没有断言判定并且序列包含至少一个元素则永远返回true, 以下是另外一种写法返回与上述例子一致的结果:

bool isFalse = new int[] { 23, 34, 4 }.Where (n => n > 50).Any();

Any对于子查询尤其有用.

AllSequenceEqual

只有当所有元素都满足一个给定断言的时候All才返回true, 以下例子返回那些采购订单金额小于100的客户列表:

dataContext.Customers.Where(c=>c.Purchases.All(p => p.Price < 100));

SequenceEqual用于比较两个序列, 只有当两个序列拥有完全等同的元素, 并且顺序也一直时才返回true

Next Page »

Powered by WordPress