﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-飛揚</title><link>http://www.cnblogs.com/xinzhyu/</link><description>--戒骄戒躁 虚心向上</description><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2008 05:00:10 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2008 05:00:10 GMT</pubDate><ttl>60</ttl><item><title>StringTemplate学习笔记(转载)</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/08/06/1261763.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Wed, 06 Aug 2008 03:01:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/08/06/1261763.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1261763.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/08/06/1261763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1261763.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1261763.html</trackback:ping><description><![CDATA[stringTemplate是一个模板引擎,同时支持java,C#,Python. 大家可以从<a href="http://www.stringtemplate.org/">http://www.stringtemplate.org/</a>下载.<br />
StringTemplate 语法说明
<p>StringTemplate的语法是以$xxxx$来进行分割的. stringtemplate关键写是区分大小写的.</p>
<p>属性引用<br />
名称属性<br />
在模板中,这个是最常用的一个属性.用于显示文字.如下:<br />
<br />
你的邮件地址:$email$<br />
<br />
替换属性名为email的值.<br />
<br />
同一个属性可以有多个值,多个值的语法如下<br />
$value;null="xxx",separator=", "$<br />
定义value属性,当value为null则显示xxx.如果有多个属性值则以,号分开<br />
<br />
字段引用<br />
如果一个属性名称是对象或集合.可以用 属性名称.字段名 访问字段值<br />
例如:<br />
你的姓名: $人.姓名$<br />
你的邮件:$人.邮件$<br />
<br />
使用语法: $对象名.字段名$<br />
在C#可以直接将一个对象设置到一个属性名称中.<br />
如:<br />
User us = new User();<br />
us.Name = "xxsssx";<br />
us.Value ="80";</p>
<p>StringTemplate st = new StringTemplate("$User.Name$,$User.Value$");<br />
st.SetAttribute("User", us);</p>
<p>Console.WriteLine(st.ToString());<br />
对于键/值对象,也同样使用上面方式进行访问如:<br />
StringTemplate a = new StringTemplate("$user.name$, $user.phone$");<br />
Hashtable user = new Hashtable();<br />
user.Add("name", "Terence");<br />
user.Add("phone", "none-of-your-business");<br />
a.SetAttribute("user", user);<br />
string results = a.ToString();</p>
<p><br />
自定义属性字段名<br />
格式: $属性名:{it.字段名}$ <br />
例如:<br />
StringTemplate st = new StringTemplate("$abcdef:{第一个: $it.ddddd$ 第二个:$it.ddddd$}$");<br />
st.SetAttribute("abcdef.{ddddd,ddddd}","中国人", "我不来了");<br />
Console.WriteLine(st.ToString());</p>
<p>如果字段名是保留字,可以使用$对象名.("保留字")$</p>
<p>一次显示多个属性<br />
$[属性名,属性名]$</p>
<p><br />
模板引用<br />
必需把模板加入同一个模板组,才能相互之间调用模板.<br />
通过$模板名()$来调用模板<br />
模板传参数<br />
$模板名(参数名=参数值,参数名=参数值)$<br />
例如:<br />
StringTemplateGroup Group = new StringTemplateGroup("Temp");<br />
Group.DefineTemplate("link", "&lt;a href='$url$'&gt;$title$&lt;/a&gt;");<br />
StringTemplate st = new StringTemplate(Group, "调用link模板,显示链接 $link(url=\"/faq/view?ID=\"+faqid, title=faqtitle)$ ,真的啊!");<br />
st.SetAttribute("faqid", 1);<br />
st.SetAttribute("title","中华人民共和国");<br />
Console.WriteLine(st.ToString());</p>
<p>循环显示使用<br />
User us = new User();<br />
us.Name = "哈哈";<br />
us.Value = "99";<br />
List&lt;User&gt; uss = new List&lt;User&gt;();<br />
uss.Add(us);<br />
uss.Add(us);<br />
uss.Add(us);<br />
uss.Add(us);<br />
StringTemplate st = new StringTemplate("&lt;table&gt;$User:{&lt;tr&gt;$it.Name$&lt;td&gt;&lt;/td&gt;$it.Value$&lt;/tr&gt;}$&lt;/table&gt;");<br />
st.SetAttribute("User", uss);<br />
Console.WriteLine(st.ToString());</p>
<p>通过模板交替显示<br />
StringTemplateGroup group = new StringTemplateGroup("Test");<br />
group.DefineTemplate("TrRed", "&lt;tr class=red&gt;&lt;td&gt;$it.name$&lt;/td&gt;&lt;td&gt;$it.value$&lt;/td&gt;&lt;/tr&gt;\n");<br />
group.DefineTemplate("TrWither", "&lt;tr class=wither&gt;&lt;td&gt;$it.name$&lt;/td&gt;&lt;td&gt;$it.value$&lt;/td&gt;&lt;/tr&gt;\n");</p>
<p>StringTemplate st = new StringTemplate(group, "&lt;table&gt;$User:TrRed(),TrWither()$&lt;/table&gt;");<br />
User us = new User();<br />
us.Name = "哈哈哈";<br />
us.Value = "999";<br />
List&lt;User&gt; uss = new List&lt;User&gt;();<br />
uss.Add(us);<br />
uss.Add(us);<br />
uss.Add(us);<br />
st.SetAttribute("User", uss);<br />
Console.WriteLine(st.ToString());<br />
<br />
例子教程下载:<a title="教程例子下载" href="http://files.cnblogs.com/lzppcc/TemplateExplame.rar">下载</a><br />
<br />
附:英文语法介绍</p>
<table cellspacing="0" cellpadding="0" border="1">
    <tr>
            <td valign="top">
            <p align="center"><strong>Syntax </strong></p>
            </td>
            <td valign="top">
            <p align="center"><strong>Description </strong></p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Evaluates to the value of <em>attribute</em>.ToString() if it exists else empty string. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;i&gt;, &lt;i0&gt; </p>
            </td>
            <td valign="top">
            <p align="center">The iteration number indexed from one and from zero, respectively, when referenced within a template being applied to an attribute or attributes. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>.<em>property</em>&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Looks for <em>property</em> of <em>attribute</em> as a property (C#), then accessor methods like get<em>Property</em>() or is<em>Property</em>(). If that fails, StringTemplate looks for a raw field of the <em>attribute</em> called <em>property</em>. Evaluates to the empty string if no such property is found. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>.(<em>expr</em>)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Indirect property lookup. Same as <em>attribute</em>.<em>property</em> except use the value of <em>expr</em> as the property_ name. Evaluates to the empty string if no such property is found. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>multi-valued-attribute</em>&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Concatenation of ToString() invoked on each element. If <em>multi-valued-attribute</em> is missing his evaluates to the empty string. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>multi-valued-attribute</em>; separator=<em>expr</em>&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Concatenation of ToString() invoked on each element separated by <em>expr</em>. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>template</em>(<em>argument-list</em>)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Include <em>template</em>. The <em>argument-list</em> is a list of attribute assignments where each assignment is of the form <em>arg</em><em>-of-template</em>=<em>expr</em> where <em>expr</em> is evaluated in the context of the surrounding template <br clear="all" />
            not of the invoked template. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>(expr)</em>(<em>argument-list</em>)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Include <em>template</em> whose name is computed via <em>expr</em>. The <em>argument-list</em> is a list of attribute assignments where each assignment is of the form <em>attribute</em>=<em>expr</em>. Example $(whichFormat)()$ looks up whichFormat's value and uses that as template name. Can also apply an indirect template to an attribute. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>:<em>template</em>(<em>argument-list</em>)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Apply <em>template</em> to <em>attribute</em>. The optional <em>argument-list</em> is evaluated before application so that you can set attributes referenced within <em>template</em>. The default attribute it is set to the value of <em>attribute</em>. If <em>attribute</em> is multi-valued, then it is set to each element in turn and <em>template</em> is invoked <em>n</em> times where <em>n</em> is the number of values in <em>attribute</em>. Example: $name:bold() applies bold() to name's value. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>:<em>(expr)</em>(<em>argument-list</em>)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Apply a template, whose name is computed from <em>expr</em>, to each value of <em>attribute</em>. Example $data:(name)()$ looks up name's value and uses that as template name to apply to data. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>:<em>t1</em>(<em>argument-list</em>): ... :<em>tN</em>(<em>argument-list</em>)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Apply multiple templates in order from left to right. The result of a template application upon a multi-valued attribute is another multi-valued attribute. The overall expression evaluates to the concatenation of all elements of the final multi-valued attribute resulting from <em>templateN</em>'s application. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>:{<em>anonymous-template</em>}&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Apply an anonymous template to each element of <em>attribute</em>. The iterated it atribute is set automatically. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>:{<em>argument-name_ | _anonymous-template</em>}&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Apply an anonymous template to each element of <em>attribute</em>. Set the <em>argument-name</em> to the iterated value and also set it. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>a1</em>,<em>a2</em>,...,<em>aN</em>:{<em>argument-list_ | _anonymous-template</em>}&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Parallel list iteration. March through the values of the attributes <em>a1</em>..<em>aN</em>, setting the values to the arguments in <em>argument-list</em> in the same order. Apply the anonymous template. There is no defined it value unless inherited from an enclosing scope. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;<em>attribute</em>:<em>t1</em>(),<em>t2</em>(),...,<em>tN</em>()&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Apply an alternating list of templates to the elements of <em>attribute</em>. The template names may include argument lists. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;if(<em>attribute</em>)&gt;<em>subtemplate</em> <br clear="all" />
            &lt;else&gt;<em>subtemplate2</em> <br clear="all" />
            &lt;endif&gt; </p>
            </td>
            <td valign="top">
            <p align="center">If <em>attribute</em> has a value or is a bool object that evaluates to true, include <em>subtemplate</em> else include <em>subtemplate2</em>. These conditionals may be nested. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;if(!<em>attribute</em>)&gt;<em>subtemplate</em>&lt;endif&gt; </p>
            </td>
            <td valign="top">
            <p align="center">If <em>attribute</em> has no value or is a bool object that evaluates to false, include <em>subtemplate</em>. These conditionals may be nested. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;first(attr)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">The first or only element of attr. You can combine operations to say things like first(rest(names)) to get second element. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;last(attr)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">The last or only element of attr. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;rest(attr)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">All but the first element of attr. Returns nothing if $attr$ a single valued. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;strip(attr)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Returns an iterator that skips any null values in $attr$. strip <br clear="all" />
            =x when x is a single-valued attribute. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;length(attr)&gt; </p>
            </td>
            <td valign="top">
            <p align="center">Return an integer indicating how many elements in length $attr$ is. Single valued attributes return 1. Strings are not special; i.e., length("foo") is 1 meaning "1 attribute". Nulls are counted in lists so a list of 300 nulls is length 300. If you don't want to count nulls, use length(strip(list)). </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">\$ or \&lt; </p>
            </td>
            <td valign="top">
            <p align="center">escaped delimiter prevents $ or &lt; from starting an attribute expression and results in that single character. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;\ &gt;, &lt;\n&gt;, &lt;\t&gt;, &lt;\r&gt; </p>
            </td>
            <td valign="top">
            <p align="center">special characters: space, newline, tab, carriage return. </p>
            </td>
        </tr>
        <tr>
            <td valign="top">
            <p align="center">&lt;! comment !&gt;, $! comment !$ </p>
            </td>
            <td valign="top">
            <p align="center">Comments, ignored by StringTemplate</p>
            </td>
        </tr>
    </table>
<div id="MySignature"><font face="Verdana"><a title="ASP.NET通用权限管理系统(FrameWork)" href="http://framework.supesoft.com/" target="_blank"><font face="Verdana">ASP.NET通用权限管理系统(FrameWork)</font></a></font> </div>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1261763.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43606/" target="_blank">[新闻]李彦宏首次表态竞价排名问题:有错能改善莫大焉</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>asp.net 2.0 自定义控件中的使用嵌入资源</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/08/03/1259435.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Sun, 03 Aug 2008 13:45:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/08/03/1259435.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1259435.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/08/03/1259435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1259435.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1259435.html</trackback:ping><description><![CDATA[<ol>
    <li>把资源文件的生成操作设为嵌入的资源</li>
    <li>然后将下面这行 <br />
    <span style="color: #000000">[assembly: WebResource("NPao.Control.Resource.DateDropDownList.js", "text/javascript")]<br />
    </span><span style="color: #000000">添加到</span>在assemblyinfo.cs中。其实这个语句放任何cs文件里，保证放在最高级namespace外就行 <br />
    <span style="color: #000000">DateDropDownList.js是资源名字，比如项目的Default namespace是&#8220;NPao.Control&#8221;， <br />
    而文件DateDropDownList.js放在/Resource目录中，那么完整资源名就是NPao.Control.Resource.DateDropDownList.js</span></li>
</ol>
</li>
<li>
<ol>
    <li><span style="color: #000000">然后在程序中调用如下： <br />
    </li>
</ol>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">
<ol>
    <li><img height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" /><span style="color: #000000">Image1.ImageUrl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.Page.ClientScript.GetWebResourceUrl(</span><span style="color: #0000ff">this</span><span style="color: #000000">.GetType(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">wuChang.WebControls.images.MessagePanel_info.gif</span><span style="color: #000000">"</span><span style="color: #000000">);</span> </li>
</ol>
</div>
</span></li>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1259435.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43605/" target="_blank">[新闻]杨致远发表博客解释辞职原因</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>实际项目中简单工厂及委托的继承的使用</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Wed, 16 Jul 2008 02:55:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1244061.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1244061.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1244061.html</trackback:ping><description><![CDATA[摘要: 最近在重构公司的电子商务网站,其中有个打折消费的功能.这里简单介绍下,比如,网站搞活动买二送一(以下称A),或者买二瓶其中价格低的一瓶半价(以下称B),.最初的设计是很粗糙的,因为之前网站是没有活动,后来增加一个活动,现在又要增加新的活动.从一开始的直接写代码,到后来的if else 判断打折条件,到现在又要添加新的打折,觉得这样的代码写的很粗糙,有种不爽的感觉.现在刚好有机会重构这里,就大概设计&nbsp;&nbsp;<a href='http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html'>阅读全文</a><img src ="http://www.cnblogs.com/xinzhyu/aggbug/1244061.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43604/" target="_blank">[新闻]微软公布免费安全软件计划</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>面向对象基础</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/06/1236835.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Sun, 06 Jul 2008 03:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/06/1236835.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1236835.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/06/1236835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1236835.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1236835.html</trackback:ping><description><![CDATA[<ol><li>什么是对象?对象是一个自包含的实体,用一组可识别的特性和行为来标识.
</li><li>什么是类? 类是具有相同属性和功能的对象的抽象的集合.
</li><li>什么是实例?实例就是一个真实的对象.实例化就是创建对象的过程,用new关键字来创建.new关键字用来在内存中申请一个空间存放数据.
</li><li>构造函数 默认一个无参数的构造函数,在new class的时候调用
</li><li>方法重载 可在不改变原方法的基础上增加功能,方法名相同,参数类型或个数有所不同
</li><li>字段是存储类要满足其设计所需要的数据,是与类相关的变量
</li><li>属性是一个方法,但在调用他们的代码看来他是一个字段,属性适合以字段的方式使用方法调用的场合(使用属性可以设置符合要求的的字段的值)
</li><li>Public 允许任何类访问 private 仅允许同一个类的成员访问,他的子类也不能访问,定义变量时默认为private,protected的子类可以访问基类
</li><li>封装:每个对象都包含它能进行操作所需要的所有信息,因此对象不必依赖其他对象来完成自己的操作 好处,减少耦合,内部可自由修改,具有清晰的对外接口
</li><li><div>继承代表了一种 "is-a"的关系,还可以理解为是对被继承者的特殊化,除了具备被继承者的特性外,还具备有自己的独有个性,他定义类之间如何关联共享.
</div><ol><li>子类拥有父类非private的属性和功能
</li><li>子类可以扩展父类没有的属性和功能
</li><li>子类还可以以自己的方式实现父类的功能(方法重写)
</li><li>子类不能继承基类的构造方法,只能被调用,可以使用base关键词
</li><li>继承使得所有子类公共的部分都放在了父类,使得代码得到共享,避免重复
</li><li>使得修改或扩展变得容易
</li><li>缺点,父类变则子类不得不变,破坏封装,父类实现的细节暴露给子类
</li><li>强耦合的关系,当2个类具备is-a的关系时,就可以考虑用继承
</li></ol></li><li><div>多态表示不同的对象可以执行相同的操作,但要通过他们自己的实现代码执行
</div><ol><li>子类以父类的身份出现
</li><li>子类工作的时候以自己的方式来实现
</li><li>子类以父类的身份出现的时候,子类特有的属性和方法不可以再使用
</li></ol></li><li>虚方法 virtual 为了让子类的实例完全接替来自父类的类成员,父类必须将该成员声明称虚拟的, 虚方法是按照运行时类型而非编译时类型进行动态绑定调用
</li><li>子类可以选择使用override关键字,来实现替换父类的实现,方法重写
</li><li><div>抽象类
</div><ol><li>类和方法前加上abstract,即抽象类和抽象方法
</li><li>抽象类不能实例化
</li><li>抽象方法是必须被子类重写的方法
</li><li>如果类中包含有抽象方法,那么类就必须定义为抽象类,不论是否还包含有其他一般方法
</li><li>抽象类拥有尽可能多的共同代码,拥有尽可能少的数据
</li><li>抽象类通常代表一个抽象概念,他提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的.
</li></ol></li><li><div>接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合
</div><ol><li>实现接口类就必须实现接口中的所以方法和属性
</li><li>一个类可以实现多个接口
</li><li>接口中的方法或属性前面不能有修饰符,方法没有方法体
</li></ol></li><li><div>抽象类与接口的区别
</div><ol><li>抽象类可以给出一些成员的实现,接口却不包含成员的实现
</li><li>抽象类中的成员可以被子类实现,而接口的成员需要类完成实现
</li><li>一个类只能继承一个抽象类,而可以接受多个接口
</li><li>类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象
</li><li>如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,用继承抽象类
</li><li>从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确认,预先定义
</li><li>通过重构改善既有代码设计
</li></ol></li><li><div>泛型是具有占位符的类接口结构和方法
</div><ol><li>使用泛型不需要装箱拆箱
</li></ol></li><li><div>委托与事件
</div><ol><li>委托是对函数的封装,可以当作给方法的特征指定一个名称.而事件是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程
</li><li>委托是一种引用方法的类型,一旦为委托分配了方法,委托将与方法具有相同的行为
</li><li>在发生其他类或对象关注的事情时,类或对象可通过事件通知他们</li></ol></li></ol><img src ="http://www.cnblogs.com/xinzhyu/aggbug/1236835.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43603/" target="_blank">[新闻]《时代》：杨致远被Google玩弄于股掌之间？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>测试用word发表blog</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/04/1235665.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Fri, 04 Jul 2008 06:52:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/04/1235665.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1235665.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/04/1235665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1235665.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1235665.html</trackback:ping><description><![CDATA[<p>
 </p><p>  测试</p><img src ="http://www.cnblogs.com/xinzhyu/aggbug/1235665.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43602/" target="_blank">[新闻]Mozilla即将结束对FireFox 2的支持</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[大话设计模式]读书笔记之序</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/01/1232854.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Tue, 01 Jul 2008 01:52:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/01/1232854.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1232854.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/01/1232854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1232854.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1232854.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; &nbsp;最近买了园子里一位大哥出的书,大话设计模式,之前也买过园子里的几本书,比如设计之道,道不远人等,怎么发现里面都有个道字<img src="http://www.cnblogs.com/Emoticons/qface/055242240.gif"  alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;道不远人也是刚刚到手,还没来得及看,<font face="Verdana">大话设计模式</font>已经由当当送出.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2本书拿到手上一比,道不远人那个厚啊,还是先从薄的开始看起吧^^<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;话说好记性不如烂笔头,之前看过很多书,当时看了现在就忘了,要记录下点学习笔记了,这个是开篇,要逐步记录下读书笔记<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;看看自己有没毅力哈
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1232854.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43601/" target="_blank">[新闻]IBM"走鹃"险胜"Cray Jaguar" 连任世界最快超级计算机</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>如何为网站项目添加子项目</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/06/25/1229462.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Wed, 25 Jun 2008 03:25:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/06/25/1229462.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1229462.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/06/25/1229462.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1229462.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1229462.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 最近要给公司的电子商务网站添加个圈子的功能.网站功能本来就包含有新闻发布,会员管理,商品购物,后台管理等,现在又要再加上圈子的功能,网站项目越来越复<br />
杂,每次编译生成的dll超过100k.这样每次修改任何一个功能中的任何一个小问题都要上传整个dll,并导致整个website的首次访问的重新编译.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 之前也曾经想过,这些功能根据不同处于项目中的不同文件夹内,比如会员的会在member,后台管理的会在admin文件夹,新闻的会在news文件夹.这样的话如果vs支持按不同文件夹生成不同dll,那我每次修改不同功能的不同文件只要上传对应的dll就可以了,不再需要上传整个website的dll.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 不过想法是美好的,事实是残酷的.vs并不支持这样的功能.所以在功能直接交互和文件共享并不多的功能上,我采取了重新建立一个projects的方法,比如把后台管理剥离出来,新建一个admin的website,这个新的projects放在website的根目录下,然后修改文件编译生成dll后的目录为..\bin并且删除项目中的web.config.编译后访问,呵呵,真的可以访问了,并且达到了拆分项目的要求.倒是并不完美,还有手动修改很多设置,并且这2个项目中不能共享相同的master,和usercontrol,甚至是图片,js等,如果直接使用相对路径,那么视图模式下将不能正常显示,如果vs直接提供新建子项目的功能并能解决共享这些文件,该有多好啊.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;于是通过Google,找到一篇文章<font face="Verdana"><a href="http://blogs.msdn.com/webdevtools/archive/2006/07/01/652986.aspx,Creating">http://blogs.msdn.com/webdevtools/archive/2006/07/01/652986.aspx</font>,Creating</a> sub-projects in IIS with Web Application Projects,不幸的是文中提到的&#8220;Web Application Projects&#8221; add-in,我<span style="font-family: Verdana">Download了,but can't&nbsp;install!<br />
&nbsp;&nbsp;&nbsp;&nbsp; 虽然这样的应用程序我们无法制作,但是我们可以按照他的思路自己修改配置啊.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 发现他的方法,跟一开始我的做法是很类似的,不过他可以共享master和user control,为什么我的不能呢?<br />
&nbsp;&nbsp;&nbsp;&nbsp; 仔细翻看了一下,发现原来他在子项目中创建了虚拟目录比如 <a href="http://localhost/group">http://localhost/group</a>,所以之前使用<font face="Verdana">~/Group.Master</font>,只能访问本项目中的master,而现在则可以访问根目录中的master了,试试usercontrol,也可以了,呵呵,原理奥妙都在这个虚拟目录中呀.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 不过最后,还是觉得这样的方式不是很舒服,不知道大家有没什么好的办法,我在这里抛下砖.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本来想发在新手区的,但是我觉得这个应该是大部分程序员都会遇到的问题,把Web 应用程序分解为多个较小项目也有很多优点,不知道各位达人平时如何解决的?<br />
如果大家觉得放在首页不合适的话,我也会移开.</span></p>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1229462.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43600/" target="_blank">[新闻]微软正式发布Exchange/SharePoint Online</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>垂直搜索引擎蜘蛛</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/29/1209743.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Thu, 29 May 2008 02:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/29/1209743.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1209743.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/29/1209743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1209743.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1209743.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本以为蜘蛛很简单,根据一个url,抓取到html内容,然后根据正则匹配数据入库.却发现,越看资料越复杂,蜘蛛应该根据抓取相似页面自动生成抓取模板,而且蜘蛛还要支持cookies和会自登录等多种协议.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;页面解析方面,也不是简单的获得标题和内容那么简单,还要做dom解析,js解析,模拟浏览器的可视化抓取等等.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先从页面数据的抽取这方面入手研究吧.
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1209743.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43598/" target="_blank">[新闻]应用程序架构指导包2.0 Beta 2发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Lucene一些技巧</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/27/1208227.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Tue, 27 May 2008 03:11:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/27/1208227.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1208227.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/27/1208227.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1208227.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1208227.html</trackback:ping><description><![CDATA[本文仅记录一些简单的使用方法，供初学者参考。 <br />
以下例子采用&nbsp;Lucene.NET&nbsp;1.9&nbsp;版本，可取去&nbsp;Lucene.Net&nbsp;下载。 <br />
<br />
1.&nbsp;基本应用 <br />
<br />
using&nbsp;System; <br />
using&nbsp;System.Collections.Generic; <br />
using&nbsp;System.Text; <br />
using&nbsp;Lucene.Net; <br />
using&nbsp;Lucene.Net.Analysis; <br />
using&nbsp;Lucene.Net.Analysis.Standard; <br />
using&nbsp;Lucene.Net.Documents; <br />
using&nbsp;Lucene.Net.Index; <br />
using&nbsp;Lucene.Net.QueryParsers; <br />
using&nbsp;Lucene.Net.Search; <br />
using&nbsp;Lucene.Net.Store; <br />
using&nbsp;Lucene.Net.Util; <br />
<br />
namespace&nbsp;ConsoleApplication1.Lucene <br />
{ <br />
&nbsp;&nbsp;public&nbsp;class&nbsp;LuceneTest <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;const&nbsp;string&nbsp;FieldName&nbsp;=&nbsp;"name"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;const&nbsp;string&nbsp;FieldValue&nbsp;=&nbsp;"value"; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;new&nbsp;RAMDirectory(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Analyzer&nbsp;analyzer&nbsp;=&nbsp;new&nbsp;StandardAnalyzer(); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;LuceneTest() <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;Index() <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.maxFieldLength&nbsp;=&nbsp;1000; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;100;&nbsp;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;document&nbsp;=&nbsp;new&nbsp;Document(); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.Add(new&nbsp;Field(FieldName,&nbsp;"name"&nbsp;+&nbsp;i,&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.Add(new&nbsp;Field(FieldValue,&nbsp;"Hello,&nbsp;World!",&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED)); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.AddDocument(document); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Optimize(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;Search() <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;QueryParser.Parse("name*",&nbsp;FieldName,&nbsp;analyzer); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(directory); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("符合条件记录:{0};&nbsp;索引库记录总数:{1}",&nbsp;hits.Length(),&nbsp;searcher.Reader.NumDocs()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;hits.Length();&nbsp;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;docId&nbsp;=&nbsp;hits.Id(i); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;name&nbsp;=&nbsp;hits.Doc(i).Get(FieldName); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;value&nbsp;=&nbsp;hits.Doc(i).Get(FieldValue); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;score&nbsp;=&nbsp;hits.Score(i); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("{0}:&nbsp;DocId:{1};&nbsp;Name:{2};&nbsp;Value:{3};&nbsp;Score:{4}",&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+&nbsp;1,&nbsp;docId,&nbsp;name,&nbsp;value,&nbsp;score); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcher.Close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;} <br />
} <br />
<br />
除了&nbsp;RAMDirectory，还可以使用&nbsp;FSDirectory。(注意&nbsp;FSDirectory.GetDirectory&nbsp;的&nbsp;create&nbsp;参数，为&nbsp;true&nbsp;时将删除已有索引库文件，可以通过&nbsp;IndexReader.IndexExists()&nbsp;方法判断。) <br />
<br />
从指定目录打开已有索引库。 <br />
private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;FSDirectory.GetDirectory("c:\index",&nbsp;false); <br />
<br />
将索引库载入内存，以提高搜索速度。 <br />
private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;new&nbsp;RAMDirectory(FSDirectory.GetDirectory(@"c:\index",&nbsp;false)); <br />
//或 <br />
//private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;new&nbsp;RAMDirectory(c:\index"); <br />
<br />
2.&nbsp;多字段搜索 <br />
<br />
使用&nbsp;MultiFieldQueryParser&nbsp;可以指定多个搜索字段。 <br />
<br />
Query&nbsp;query&nbsp;=&nbsp;MultiFieldQueryParser.Parse("name*",&nbsp;new&nbsp;string[]&nbsp;{&nbsp;FieldName,&nbsp;FieldValue&nbsp;},&nbsp;analyzer); <br />
<br />
IndexReader&nbsp;reader&nbsp;=&nbsp;IndexReader.Open(directory); <br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
3.&nbsp;多条件搜索 <br />
<br />
除了使用&nbsp;QueryParser.Parse&nbsp;分解复杂的搜索语法外，还可以通过组合多个&nbsp;Query&nbsp;来达到目的。 <br />
<br />
Query&nbsp;query1&nbsp;=&nbsp;new&nbsp;TermQuery(new&nbsp;Term(FieldValue,&nbsp;"name1"));&nbsp;//&nbsp;词语搜索 <br />
Query&nbsp;query2&nbsp;=&nbsp;new&nbsp;WildcardQuery(new&nbsp;Term(FieldName,&nbsp;"name*"));&nbsp;//&nbsp;通配符&nbsp; <br />
</cc>//Query&nbsp;query3&nbsp;=&nbsp;new&nbsp;PrefixQuery(new&nbsp;Term(FieldName,&nbsp;"name1"));&nbsp;//&nbsp;字段搜索&nbsp;Field:Keyword，自动在结尾添加&nbsp;* <br />
//Query&nbsp;query4&nbsp;=&nbsp;new&nbsp;RangeQuery(new&nbsp;Term(FieldNumber,&nbsp;NumberTools.LongToString(11L)),&nbsp;new&nbsp;Term(FieldNumber,&nbsp;NumberTools.LongToString(13L)),&nbsp;true);&nbsp;//&nbsp;范围搜索 <br />
//Query&nbsp;query5&nbsp;=&nbsp;new&nbsp;FilteredQuery(query,&nbsp;filter);&nbsp;//&nbsp;带过滤条件的搜索 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
BooleanQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;BooleanQuery(); <br />
query.Add(query1,&nbsp;BooleanClause.Occur.MUST); <br />
query.Add(query2,&nbsp;BooleanClause.Occur.MUST); <br />
<br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
4.&nbsp;设置权重 <br />
<br />
可以给&nbsp;Document&nbsp;和&nbsp;Field&nbsp;增加权重(Boost)，使其在搜索结果排名更加靠前。缺省情况下，搜索结果以&nbsp;Document.Score&nbsp;作为排序依据，该数值越大排名越靠前。Boost&nbsp;缺省值为&nbsp;1。 <br />
<br />
Score&nbsp;=&nbsp;Score&nbsp;*&nbsp;Boost <br />
<br />
通过上面的公式，我们就可以设置不同的权重来影响排名。 <br />
<br />
如下面的例子中根据&nbsp;VIP&nbsp;级别设定不同的权重。 <br />
Document&nbsp;document&nbsp;=&nbsp;new&nbsp;Document(); <br />
switch&nbsp;(vip) <br />
{ <br />
&nbsp;&nbsp;case&nbsp;VIP.Gold:&nbsp;document.SetBoost(2F);&nbsp;break; <br />
&nbsp;&nbsp;case&nbsp;VIP.Argentine:&nbsp;document.SetBoost(1.5F);&nbsp;break; <br />
} <br />
<br />
只要&nbsp;Boost&nbsp;足够大，那么就可以让某个命中结果永远排第一位，这就是百度等网站的"收费排名"业务。明显有失公平，鄙视一把。&nbsp;&nbsp; <br />
<br />
5.&nbsp;排序 <br />
<br />
通过&nbsp;SortField&nbsp;的构造参数，我们可以设置排序字段，排序条件，以及倒排。 <br />
<br />
Sort&nbsp;sort&nbsp;=&nbsp;new&nbsp;Sort(new&nbsp;SortField(FieldName,&nbsp;SortField.DOC,&nbsp;false)); <br />
<br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query,&nbsp;sort); <br />
<br />
排序对搜索速度影响还是很大的，尽可能不要使用多个排序条件。 <br />
<br />
6.&nbsp;过滤 <br />
<br />
使用&nbsp;Filter&nbsp;对搜索结果进行过滤，可以获得更小范围内更精确的结果。 <br />
<br />
举个例子，我们搜索上架时间在&nbsp;2005-10-1&nbsp;到&nbsp;2005-10-30&nbsp;之间的商品。 <br />
对于日期时间，我们需要转换一下才能添加到索引库，同时还必须是索引字段。 <br />
//&nbsp;index <br />
document.Add(FieldDate,&nbsp;DateField.DateToString(date),&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED); <br />
<br />
//... <br />
<br />
//&nbsp;search <br />
Filter&nbsp;filter&nbsp;=&nbsp;new&nbsp;DateFilter(FieldDate,&nbsp;DateTime.Parse("2005-10-1"),&nbsp;DateTime.Parse("2005-10-30")); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query,&nbsp;filter); <br />
<br />
除了日期时间，还可以使用整数。比如搜索价格在&nbsp;100&nbsp;~&nbsp;200&nbsp;之间的商品。 <br />
Lucene.Net&nbsp;NumberTools&nbsp;对于数字进行了补位处理，如果需要使用浮点数可以自己参考源码进行。 <br />
//&nbsp;index <br />
document.Add(new&nbsp;Field(FieldNumber,&nbsp;NumberTools.LongToString((long)price),&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED)); <br />
<br />
//... <br />
<br />
//&nbsp;search <br />
Filter&nbsp;filter&nbsp;=&nbsp;new&nbsp;RangeFilter(FieldNumber,&nbsp;NumberTools.LongToString(100L),&nbsp;NumberTools.LongToString(200L),&nbsp;true,&nbsp;true); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query,&nbsp;filter); <br />
<br />
使用&nbsp;Query&nbsp;作为过滤条件。 <br />
QueryFilter&nbsp;filter&nbsp;=&nbsp;new&nbsp;QueryFilter(QueryParser.Parse("name2",&nbsp;FieldValue,&nbsp;analyzer)); <br />
<br />
我们还可以使用&nbsp;FilteredQuery&nbsp;进行多条件过滤。 <br />
<br />
Filter&nbsp;filter&nbsp;=&nbsp;new&nbsp;DateFilter(FieldDate,&nbsp;DateTime.Parse("2005-10-10"),&nbsp;DateTime.Parse("2005-10-15")); <br />
Filter&nbsp;filter2&nbsp;=&nbsp;new&nbsp;RangeFilter(FieldNumber,&nbsp;NumberTools.LongToString(11L),&nbsp;NumberTools.LongToString(13L),&nbsp;true,&nbsp;true); <br />
<br />
Query&nbsp;query&nbsp;=&nbsp;QueryParser.Parse("name*",&nbsp;FieldName,&nbsp;analyzer); <br />
query&nbsp;=&nbsp;new&nbsp;FilteredQuery(query,&nbsp;filter); <br />
query&nbsp;=&nbsp;new&nbsp;FilteredQuery(query,&nbsp;filter2); <br />
<br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
</cc>7.&nbsp;分布搜索 <br />
<br />
我们可以使用&nbsp;MultiReader&nbsp;或&nbsp;MultiSearcher&nbsp;搜索多个索引库。 <br />
<br />
MultiReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;MultiReader(new&nbsp;IndexReader[]&nbsp;{&nbsp;IndexReader.Open(@"c:\index"),&nbsp;IndexReader.Open(@"\\server\index")&nbsp;}); <br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
或 <br />
<br />
IndexSearcher&nbsp;searcher1&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader1); <br />
IndexSearcher&nbsp;searcher2&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader2); <br />
MultiSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;MultiSearcher(new&nbsp;Searchable[]&nbsp;{&nbsp;searcher1,&nbsp;searcher2&nbsp;}); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
还可以使用&nbsp;ParallelMultiSearcher&nbsp;进行多线程并行搜索。 <br />
<br />
8.&nbsp;合并索引库 <br />
<br />
将&nbsp;directory1&nbsp;合并到&nbsp;directory2&nbsp;中。 <br />
Directory&nbsp;directory1&nbsp;=&nbsp;FSDirectory.GetDirectory("index1",&nbsp;false); <br />
Directory&nbsp;directory2&nbsp;=&nbsp;FSDirectory.GetDirectory("index2",&nbsp;false); <br />
<br />
IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory2,&nbsp;analyzer,&nbsp;false); <br />
writer.AddIndexes(new&nbsp;Directory[]&nbsp;{&nbsp;directory&nbsp;}); <br />
Console.WriteLine(writer.DocCount()); <br />
writer.Close(); <br />
<br />
9.&nbsp;显示搜索语法字符串 <br />
<br />
我们组合了很多种搜索条件，或许想看看与其对等的搜索语法串是什么样的。 <br />
BooleanQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;BooleanQuery(); <br />
query.Add(query1,&nbsp;true,&nbsp;false); <br />
query.Add(query2,&nbsp;true,&nbsp;false); <br />
//... <br />
<br />
Console.WriteLine("Syntax:&nbsp;{0}",&nbsp;query.ToString()); <br />
<br />
输出： <br />
Syntax:&nbsp;+(name:name*&nbsp;value:name*)&nbsp;+number:[0000000000000000b&nbsp;TO&nbsp;0000000000000000d] <br />
<br />
呵呵，就这么简单。 <br />
<br />
10.&nbsp;操作索引库 <br />
<br />
删除&nbsp;(软删除，仅添加了删除标记。调用&nbsp;IndexWriter.Optimize()&nbsp;后真正删除。) <br />
IndexReader&nbsp;reader&nbsp;=&nbsp;IndexReader.Open(directory); <br />
<br />
//&nbsp;删除指定序号(DocId)的&nbsp;Document。 <br />
reader.Delete(123); <br />
<br />
//&nbsp;删除包含指定&nbsp;Term&nbsp;的&nbsp;Document。 <br />
reader.Delete(new&nbsp;Term(FieldValue,&nbsp;"Hello")); <br />
<br />
//&nbsp;恢复软删除。 <br />
reader.UndeleteAll(); <br />
<br />
reader.Close(); <br />
<br />
增量更新&nbsp;(只需将&nbsp;create&nbsp;参数设为&nbsp;false，即可往现有索引库添加新数据。) <br />
Directory&nbsp;directory&nbsp;=&nbsp;FSDirectory.GetDirectory("index",&nbsp;false); <br />
IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;false); <br />
writer.AddDocument(doc1); <br />
writer.AddDocument(doc2); <br />
writer.Optimize(); <br />
writer.Close(); <br />
<br />
11.&nbsp;优化 <br />
<br />
批量向&nbsp;FSDirectory&nbsp;增加索引时，增大合并因子(mergeFactor&nbsp;)和最小文档合并数(minMergeDocs)有助于提高性能，减少索引时间。 <br />
<br />
IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;true); <br />
<br />
writer.maxFieldLength&nbsp;=&nbsp;1000;&nbsp;//&nbsp;字段最大长度 <br />
writer.mergeFactor&nbsp;=&nbsp;1000; <br />
writer.minMergeDocs&nbsp;=&nbsp;1000; <br />
<br />
for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10000;&nbsp;i++) <br />
{ <br />
&nbsp;&nbsp;//&nbsp;Add&nbsp;Documentes... <br />
} <br />
<br />
writer.Optimize(); <br />
writer.Close(); <br />
<br />
相关参数说明&nbsp; <br />
<br />
<br />
转自《深入&nbsp;Lucene&nbsp;索引机制》 <br />
<br />
利用&nbsp;Lucene，在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率。当你需要索引大量的文件时，你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中。为了解决这个问题,&nbsp;Lucene&nbsp;在内存中持有一块缓冲区。但我们如何控制&nbsp;Lucene&nbsp;的缓冲区呢？幸运的是，Lucene&nbsp;的类&nbsp;IndexWriter&nbsp;提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。 <br />
<br />
1．合并因子&nbsp;(mergeFactor) <br />
<br />
这个参数决定了在&nbsp;Lucene&nbsp;的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率。比如，如果合并因子的值是&nbsp;10，那么当内存中的文档数达到&nbsp;10&nbsp;的时候所有的文档都必须写到磁盘上的一个新的索引块中。并且，如果磁盘上的索引块的隔数达到&nbsp;10&nbsp;的话，这&nbsp;10&nbsp;个索引块会被合并成一个新的索引块。这个参数的默认值是&nbsp;10，如果需要索引的文档数非常多的话这个值将是非常不合适的。对批处理的索引来讲，为这个参数赋一个比较大的值会得到比较好的索引效果。 <br />
<br />
2．最小合并文档数&nbsp;(minMergeDocs) <br />
<br />
这个参数也会影响索引的性能。它决定了内存中的文档数至少达到多少才能将它们写回磁盘。这个参数的默认值是10，如果你有足够的内存，那么将这个值尽量设的比较大一些将会显著的提高索引性能。 <br />
<br />
3．最大合并文档数&nbsp;(maxMergeDocs) <br />
<br />
这个参数决定了一个索引块中的最大的文档数。它的默认值是&nbsp;Integer.MAX_VALUE，将这个参数设置为比较大的值可以提高索引效率和检索速度，由于该参数的默认值是整型的最大值，所以我们一般不需要改动这个参数。 <br />
</cc>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1208227.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43597/" target="_blank">[新闻]推波助澜 微软推出“I'm a PC”商店</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>利用Lucene.net搜索引擎进行多条件搜索的做法 </title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207816.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Mon, 26 May 2008 09:08:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207816.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1207816.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1207816.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1207816.html</trackback:ping><description><![CDATA[1 联合两个索引查询，已解决： <br />
IndexSearcher[] searchers = new IndexSearcher[2];&nbsp; <br />
&nbsp;&nbsp; <br />
searchers[0] = new IndexSearcher(m_indexpath); <br />
searchers[1] = new IndexSearcher(m_outindexpath); <br />
<br />
MultiSearcher multiSearcher = new MultiSearcher(searchers); <br />
<br />
<span style="color: #ff0000">2，还有个进行多条件搜索 and 与 or 的操作———— <br />
<font color="#000000">用 MultiFieldQueryParser <br />
建议重新封装 <br />
MultiFieldQueryParser.Parser(p[],d[],f[],analyer)&nbsp;&nbsp;成or 与 and操作合一 <br />
</font>或者&nbsp;<br />
<font color="#000000"><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BooleanQuery thisQuery = new BooleanQuery();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisQuery.Add(query1,true,false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisQuery.Add(query2, false, false);<br />
</font><br />
</font></span>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1207816.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43596/" target="_blank">[新闻]火狐中国版正式发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>