[转载]Excel 行列转换,并实现一行转多行

mikel阅读(961)

[转载]Excel 行列转换,并实现一行转多行 – Share – 博客园.

业务部门要给企业做一个报表转换,感觉不需要使用宏或程序也能完成。

研究了一下午,终于整出来了,感觉Excel是如此的强大,和大家分享一下。

源格式:

目标格式:

第1行的料件项次共有17个,料件项次下单耗,损耗率为空的不显示。

料号:=INDEX(亿泰兴!$C:$C,IF(MOD(ROW()-1,17)=0,(ROW()-1)/17+3,(ROW()-1)/17+4))

料件项号:=INDEX(亿泰兴!$E:$BT,1,(IF(MOD(ROW()-1,17)=0,17,MOD(ROW()-1,17))-1)*4+COLUMN()-1)

单耗:=INDEX(亿泰兴!$E:$BT,IF(MOD(ROW()-1,17)=0,(ROW()-1)/17+3,(ROW()-1) /17+4),(IF(MOD(ROW()-1,17)=0,17,MOD(ROW()-1,17))-1)*4+COLUMN()-2)

损耗率:=INDEX(亿泰兴!$E:$BT,IF(MOD(ROW()-1,17)=0,(ROW()-1)/17+3,(ROW()-1) /17+4),(IF(MOD(ROW()-1,17)=0,17,MOD(ROW()-1,17))-1)*4+COLUMN()-2)

说明:index()函数为取一个数组中元素的引用,其中“单耗”与“损耗率”公式是相同。

亿泰兴!$C:$C:(亿泰兴)为源数据sheet名,从第1张图可看到料号列在C列,所以取C列为料号数组。

IF(MOD(ROW()-1,17)=0,(ROW()-1)/17+3,(ROW()-1)/17+4):

取当前行号是否能被17整除,因前3列是表头,所以需要从第4个元素开始读取。因目标格式中第一行是表头,所以是从行号第二行开始,需要Row()-1。

Column()是返回当前列号,Column()-2是因为单耗与损耗率是从第3列开始的。

具体请大家自行分析,下载地址:/Files/xiaobier/成品耗用明細.rar

[转载]jquery.bitmapcutter(图片裁剪插件) 与 jquery1.4.2 配合

mikel阅读(935)

[转载]jquery.bitmapcutter(图片裁剪插件) 与 jquery1.4.2 配合 – 此地民风淳朴,一心向善 – 博客园.

滚滚长江东逝水,浪花淘尽英雄, 听着苏山大叔的的歌,灵感来了。

在博问中问了许久的问题,一直没有人帮我解决,我郁闷,我压抑,我无奈,在经过三天的假期的等待,回答数依据保持为0。

于是今天来了,下了决定自己解决。

我到底是遇到了什么问题呢?

问题就是JQuery.bitmapcutter与JQuery1.4.2配合时,发现裁剪框无法移动。

jQuery.bitmapcutter:这个东东就是老外写的一个,可以实现异步上传头像,而且可以移动,旋转,载剪。(说心里话,老外真的是聪明,要是开发语言是中文的话,我其实也很聪明)。

为了解决问题,我默默的读了好些遍他的js原码,于是,于是,我………………………………………………..就这样。

(1)、下面代码是 jQuery.bitmapcutter中,装载裁剪的容器DIV ,要知道,他以前是没有id的,比如id=”cutterDiv” ,这个是我自己加的。

//cutter
var $cutter = $(‘<div id=”cutterDiv” class=”jquery-bitmapcutter-cutter” >&nbsp</div>’)
.css(ps.cutterSize)
.css({
‘opacity’: .4,
‘left’: (ps.holderSize.width – ps.cutterSize.width) / 2,
‘top’: (ps.holderSize.height – ps.cutterSize.height) / 2
}).appendTo($holder);

(2)、我们在来看看代码事件绑定的代码块。你可以在jquery.bitmapcutter 的js文件中找到。

dragndrop: function(setting) {
var ps = $.fn.extend({
limited: {
lw: { min: 0, max: 100 },
th: { min: 0, max: 100 }
},
handler: null,
callback: function(e) { }
}, setting);

var dragndrop = {
drag: function(e) {
var d = e.data.d;
var p = {
left: Math.min(Math.max(e.pageX + d.left, ps.limited.lw.min), ps.limited.lw.max),
top: Math.min(Math.max(e.pageY + d.top, ps.limited.th.min), ps.limited.th.max),
target: d.target
};
ps.callback(p);
},
drop: function(e) {
$(“#cutterDiv”).unbind(‘mousemove’, dragndrop.drag).unbind(‘mouseup’, dragndrop.drop);
}
};

return this.each(function() {
if (ps.handler == null) { ps.handler = $(this) };
var handler = (typeof ps.handler == ‘string’ ? $(ps.handler) : ps.handler);
handler.bind(‘mousedown’, function(e) {
var data = {
target: $(this),
left: $(this).f(‘left’) – e.pageX,
top: $(this).f(‘top’) – e.pageY
};
$(“#cutterDiv”).bind(‘mousemove’, { d: data }, dragndrop.drag).bind(‘mouseup’, dragndrop.drop);
});
});
}

这个就是主要用来处理拖动裁剪框的移动的代码。(注意以下两行代码,这是我改造过的)

$(“#cutterDiv”).unbind(‘mousemove’, dragndrop.drag).unbind(‘mouseup’, dragndrop.drop);

$(“#cutterDiv”).bind(‘mousemove’, { d: data }, dragndrop.drag).bind(‘mouseup’, dragndrop.drop);

来看看上而两行代码的原型:

$().unbind(‘mousemove’, dragndrop.drag).unbind(‘mouseup’, dragndrop.drop);

$().bind(‘mousemove’, { d: data }, dragndrop.drag).bind(‘mouseup’, dragndrop.drop);

是的,他们的区别在于:我用了元素的id来锁定div,而前者没有用。

是作者写错了吗?当然不是,因为jquery1.4.2 和jquery1.3.1 中,元素选择器由1.3.1 – 1.4.2 发展的过程中,发生了变化。这就是原因喽!简单吧!作者还是很厉害的,js写的特别的好。赞一个。

终述一下:首先给裁剪框容器增加id,然后在事件绑定中,将元素的选定方式改为依靠id 来选择,你明白了吗?

来个截图:

好了,就写到这里了,谢谢大家的观赏。

我是百灵。

[转载]按后退键退出Android程序

mikel阅读(1076)

[转载]按后退键退出Android程序 – 追梦人 – 博客园.

主要的目的是按后退键的时候,让程序能够退出。

实现起来的思路:

1.捕获后退键被按了这个事件。

    @Override  
            public boolean onKeyDown(int keyCode, KeyEvent event)  {  
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {   
                //按下的如果是BACK,同时没有重复  
                  //DO SOMETHING      
                }  
      
                return super.onKeyDown(keyCode, event);  
            }   

2.在后退键被按的事件里退出程序

这里也有两种方式:直接退出程序,或者退出到主屏幕。

1)退出程序的方法有两种:

android.os.Process.killProcess(android.os.Process.myPid());

System.exit(0);    

我试了这两种方法,但是奇怪的是,在1.5模拟器下,程序确实被KILL了,但是马上Android又重新启动了程序。

另外还有一种方式,比较友好,可以释放资源,我觉得可行,就是实现起来麻烦一点,需要逐级退出,重写onResume()方法:

     @Override  
    protected void onResume() {  
        super.onResume();  
        if(mExiting){  
            finish();  
        }  
    }  

2)退出到主屏幕
这个比较简单,新建一个主屏幕的Intent就可以。

    Intent home = new Intent(Intent.ACTION_MAIN);   
        home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
        home.addCategory(Intent.CATEGORY_HOME);   
        startActivity(home);  

我最后采用了按后退键回到主屏幕的方式,实现代码如下:

@Override  
 public boolean onKeyDown(int keyCode, KeyEvent event) {  
  if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // 按下的如果是BACK,同时没有重复  
   Intent home = new Intent(Intent.ACTION_MAIN);  
   home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
   home.addCategory(Intent.CATEGORY_HOME);  
   startActivity(home);  
  }  
  return super.onKeyDown(keyCode, event);  
 } 

[转载]ASP.NET MVC3 Razor视图引擎-基础语法

mikel阅读(937)

[转载]ASP.NET MVC3 Razor视图引擎-基础语法 – dotNetDR_ 深圳 点燃象征希望的烛光 – 博客园.

I:ASP.NET MVC3在Visual Studio 2010中的变化

在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化

image

1.ASP.NET MVC3必要的运行环境为.NET 4.0 (想在3.5用MVC3,没门!)
2.默认MVC3模板项目已集成

image

3.全新的Razor视图引擎
@{

ViewBag.Title = "Home Page";

}
<h2>@ViewBag.Message</h2>
To learn more about ASP.NET MVC visit

<a title="ASP.NET MVC Website" href="http://asp.net/mvc"></a>

<a title="ASP.NET MVC Website" href="http://asp.net/mvc">http://asp.net/mvc

</a>

<a title="ASP.NET MVC Website" href="http://asp.net/mvc"> </a>.

@ServerInfo.GetHtml()

4. 关于所有带”_”开头的文档

ASP.NET 4默认情况下会拒绝所有访问地址以”_”开头的_*.cshtml文档.关于*.cshtml文档,其实他是WebMatrix的一部分,稍后将会详细介绍该以”_”文档的使用说明.

例如访问 http://localhost:7985/_ViewPage1.cshtml

image

II:Razor视图引擎-基础语法

-基础-

所有以 @开头 或 @{ /* 代码体 */ }  (在@与{直接不得添加任何空格) 的部分代码都会被ASP.NET引擎进行处理.
在 @{ /*代码体*/ } 内的代码每一行都必须以”;”结束,如
@{
var i = 10;
var y = 20;
}
而 @xxx 则不需要以”;”作为结束符,如

@i 输出 10

@y; 输出 20;
代码区内字母分大小写.
字符类型常量必须用””括起例如: @{ string str = “my string”; }

-注意-

如需要在页面输出”@”字符
可以使用HTML ASCII编码&#64;
当然Razor也提供智能分析功能: 如果在@的前一个字符若是非空白字符,则ASP.NET不会对其进行处理

如:<p>text@i xx</p> 输出 text@i xx

单行语法:

@{ var I = 10; }
多行语法:

@{ 

    var I = 10;

    Var y = 20;

}

1. 使用局部变量,Razor不支持访问修饰符(public,private等,这个没任何意义)
在单行上定义局部变量
@{ var total = 7; }
@{ var myMessage = “Hello World”;}
在多行上定义局部变量

@{

    var greeting = "Welcome to our site!";

    var weekDay = DateTime.Now.DayOfWeek;

    var greetingMessage = greeting + " Today is: " + weekDay;

}

在上下文中使用变量

<p>The value of your account is: @total </p>

<p>The value of myMessage is: @myMessage</p>

注意:变量拼接输出

@{ var i = 10; }

text @i text

将输出 text 10 text
但是如果你想要输出 text10text 呢?

<p>text@{@i}text</p>即可

<p>text@i text</p> 将输出 text@i text

<p>text@itext</p> 将输出 text@itext

<p>text @itext</p> 将报错

如果是输出的是变量的方法名则不需要用@{}括住也可生效如:

text@i.ToString()text

使用变量对象可直接写: @var1 @var2 @myObject.xx

2. 使用逻辑处理

@{

    if (xx)

    {

    //do something

    }

    else

    {

    //do anything

    }

}

3. 在@{… }内部使用html标记

@{

    <p>text</P>

    <div>div1</div>

}

4. 在@{…}内部输出文本
利用@:进行单行输出:

@{

    @:This is some text

    @:This is text too

    @:@i 也可输出变量

}

利用进行多行输出:

@{

    <text>

        tomorrow is good

        some girl is nice

    </text>

}

5. 在@{…}内部使用注释

@{

    //单行注释

    var i = 10;

    //defg

}

 

    @* 多行注释 *@

    @* 

        多行注释

        多行注释 

    *@

 

 

@{

    @*

        多行注释

        多行注释 

    *@

    var i = 10;  @* asdfasf *@

}

 

<!-- 同时也可以使用C#默认的/* ... */ -->

 

@{

    /*

        多行注释 

    */

}

若在@{ … }内部使用注释,则会输出到页面之中,如果在内部使用@变量,则会被处理
@{


}
输出:

6. 类型转换
AsInt(), IsInt()
AsBool(),IsBool()
AsFloat(),IsFloat()
AsDecimal(),IsDecimal()
AsDateTime(),IsDateTime()
ToString()
例子:

@{

    var i = “10”;

}

 

<p> i = @i.AsInt() </p> <!-- 输出 i = 10 --> 

7. 使用循环

<!--方式1-->

@for (int i = 10; i < 11; i++)

{

    @:@i

}

<!--方式2-->

@{

    for (int i = 10; i < 11; i++)

    {

        //do something

    }

}

 

<!--while同理-->

到此结束!呼呼
声明: 本文版权归作者和博客园共有,转载必须保留此段声明。

[转载]写出优雅简明代码的论题集 -- Csharp(C#)篇[2]

mikel阅读(921)

[转载]写出优雅简明代码的论题集 — Csharp(C#)篇[2] – 喜乐的ASP.NET(Alex Song) – 博客园.

谢谢大家对本系列第一篇写出优雅简明代码的论题集 — Csharp(C#)篇[1]的回复和讨论,我相信针锋相对的辩论不仅有助于发现答案,更让我们了解问题后面的实质。

对程序员而言,我们的代码需要:

1. 在预算内实现需求,让用户可以使用 — 让自己或者公司可以赚到钱

2. 方便自己修改及日后维护

3. 方便别人修改及日后维护

4. 便于重复使用,为以后的开发节省时间

5. 让系统高效的运作

从美国商学院毕业的学生们掌握了很多相似的思维模式,这不仅有利于他们解决问题,更重要的是方便他们彼此之间沟通。– 换句话说,他们毕业后都安装上了相同的协议和一些可通用的接口,这样有一个基础平台可以让他们协同工作。

论题七:命名规范

也许有人认为没有必要再提这个问题,但在日常编码生活中,这的确是一个很重要的话题。

7.1  类名、方法、常数使用Pascal casing

public class MyClass
{
    const int DefaultNumber = 100;
    public void MyMethod()
    { }
}

7.2 局部变量,参数用camel casing

           partial void OnContactIdChanging(int value)
            {
                int number;

            }

7.3 interface 名字以I 开头

7.4 尽量不用单个字符命名变量,象 i 或者 t 。使用 index 或者 temp 之类代替。

7.5 将所有来自framework 的 namespace 放在前面,而后再放第三方或自定义的:

using System;
using System.Linq;
using System.Data.Linq;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel.DataAnnotations;
using CodeSmith.Data.Attributes;
using CodeSmith.Data.Rules;

论题八: 一个方法的参数不能超过5个,当多于5个时,应进行函数的拆分或者参数的封装。– 嚯嚯就像论题一样的规定

一些说明:不是为了给自己一个紧箍咒,而是在日常编程中,我们发现如果你写的方法不满足这样一个条件,一年后,就算是你自己也不太想去维护和修改,如果换成是其他程序员会对此更加的头痛,对吗?
论题九: 不要滥用注释,有些非常清晰明确的代码不需要注释

仅在必要的时候注释你的代码,不要太多,并且注释也要简单给力。
论题十: 不要把数值hard-code在代码中,使用const 来定义
论题十一: 不要使用””, 使用string.Empty

正确的:

string name = string.Empty;

不建议:

string name = &quot;&quot;;

论题十二: 善于合并if

观察下面这段可爱的代码:

public bool Equals(CommentData obj) {
if (!CommentId.Equals(obj.CommentId)) return false;
if (!Comment.Equals(obj.Comment)) return false;
if (!CommentorId.Equals(obj.CommentorId)) return false;
return true;
}

如果我们写成这样会不会好些呢:

public bool Equals(CommentData obj) {
return CommentId == obj.CommentId &amp;&amp;
Comment.Equals(obj.Comment) &amp;&amp;
CommentorId == obj.CommentorId;
}

论题十三: 不断重构你的代码

当有新的需求或新改动的时候,可以拨一些时间来重构。 — 你可能突然发现,原来重构后的代码可以如此美丽。使用一些重构的插件,比如resharper可以使你事半功倍。

[转载]写出优雅简明代码的论题集 -- Csharp(C#)篇[1]

mikel阅读(1200)

[转载]写出优雅简明代码的论题集 — Csharp(C#)篇[1] – 喜乐的ASP.NET(Alex Song) – 博客园.

最近和一些朋友讨论如何写出优雅的代码,我们都很喜欢C#,所以以C#为例。主要一共有三位程序员在一起讨论,为简单起见我用ABC代表我们三个人。

有时候我们会针对一些代码进行讨论,有时候我们会提出一些观点,有时候我们会一起学习网上一些现有的博客,为了便于大家引用,我给每一个论题都编上号。

在很多情况下,我们的意见统一,那么我会给大家呈现我们的结论;但是有些情况我们有分歧。

你可以加入我们的讨论,我非常也希望能够获知你的意见,让我们一起茁壮成长!

好吧,让我们今天就开始。

论题一:函数越小越好!

象鼠

相信绝大部分程序员会认同这一点,维护一个超过100行的函数会让人抓狂。

我记得我以前修改过一个用cobol写的程序,一个文件超过10万行,我为了进行一个极其小的修改花了3天的时间,而且最后自己也不知道会不会造成什么严重的后果。– 这已经过去8年了,希望那段代码运行良好。

到底理想状态下,我们的函数应该不大于多少行?我们三个人的答案是:

A: 10 行

B: 15 行

C: 20 行

论题二:用 Linq 简化代码

Linq有时可以帮助我们写出一些非常“人性”的语句。

下面的这个函数是用于在数据库中插入新的评论:

        public static void Create(IEnumerable<CommentData> Comments, SqlConnection cn)
        {
            // validate params
            if (null == cn) throw new ArgumentNullException("cn");
            if (cn.State != ConnectionState.Open) throw new ArgumentException("Invalid parameter: connection is not open.", "cn");
            if (null == Comments) throw new ArgumentNullException("Comments");
            foreach (CommentData data in Comments)
            {
                if (data.CommentId.HasValue)
                    throw new ArgumentNullException("Create is only for saving new data.  Call save for existing data.", "data");
            }
....

其中foreach这一部分可以简化为:

           if (Comments.Any(data => data.CommentId.HasValue))
            {
                throw new ArgumentNullException("Create is only for saving new data.  Call save for existing data.", "data");
            }

在这一点上,我们存在分歧,A认为没有必要进行简化,因为原来的已经很明确了;但B认为简化后的代码可读性更强,看上去更加直接。

希望每个人都已经知道C#的这个用法了,直接上一些代码:

3.1

原始代码:

List<int> idsToFind = new List<int>();
idsToFind.Add(1);
idsToFind.Add(2);

修改后:

List<int> idsToFind = new List<int> {1, 2};

3.2

原始代码:

var startingPoint = new Point();
startingPoint.X = 5;
startingPoint.Y = 13;

修改后:

var startingPoint = new Point() { X = 5, Y = 13 };

论题四:运用 ?:和??

据说,有些公司会拿这个来测试入门的程序员:

4.1

原始代码:

if (c != null)
    System.Console.WriteLine(c.Name);
else
    System.Console.WriteLine("List element has null value.");

修改后:

System.Console.WriteLine(c != null ? c.Name : "List element has null value.");

4.2

原始代码:

string name = value;   
if (value == null)
{
name = string.Empty;
}

修改后:

string name = (value != null) ? value : string.Empty;

还可以更简单,变成:

string name = value ?? string.Empty;

论题五: 运用AS

原始代码:

if (employee is SalariedEmployee)

{
    var salEmp = (SalariedEmployee)employee;
    pay = salEmp.WeeklySalary;
    // ...
}

修改后:

var salEmployee = employee as SalariedEmployee;
if (salEmployee != null)
{
   pay = salEmployee.WeeklySalary;
    // ...
}

论题六: 运用 using

using首次出现是在visual studio 2005 中,在这以前,很多程序员晕倒在了释放资源的逻辑中。

使用using语句实际上生成的IL代码中是一个try, finally代码块,在finally代码块里释放资源。

原始代码:

public IEnumerable<Order> GetOrders()

{
    var orders = new List<Order>(); 
    var con = new SqlConnection("some connection string");
    var cmd = new SqlCommand("select * from orders", con);
    var rs = cmd.ExecuteReader(); 
    while (rs.Read())

    {

        // ...

    } 
    rs.Dispose();
    cmd.Dispose();
    con.Dispose(); 
    return orders;
} 

这是一段非常丑陋的代码,我们完全迷失在dispose群中,什么时候要调用哪个dispose啊? 天哪? 如果我们用 finally, 可以将代码写为:

public IEnumerable<Order> GetOrders()

{

    SqlConnection con = null;

    SqlCommand cmd = null;

    SqlDataReader rs = null;

    var orders = new List<Order>();

    try

    {

        con = new SqlConnection("some connection string");

        cmd = new SqlCommand("select * from orders", con);

        rs = cmd.ExecuteReader();

        while (rs.Read())

        {

            // ...

        }

    }

    finally

    {

        rs.Dispose();

        cmd.Dispose();

        con.Dispose();

    }

    return orders;

}

看看using到底给我们带来了什么:

public IEnumerable<Order> GetOrders()

{

    var orders = new List<Order>(); 
   using (var con = new SqlConnection("some connection string"))
    {
        using (var cmd = new SqlCommand("select * from orders", con))
        {
            using (var rs = cmd.ExecuteReader())
            {
                while (rs.Read())
                {

                    // ...

                }

            }

        }

    } 
    return orders;

好多了,对吗? 完全不用再用那一堆的try/finally 代码了,也不用使用一堆的null,为了使代码更轻巧,让我们再做小小修改:

      public IEnumerable<Order> GetOrders()
{

    var orders = new List<Order>(); 

    using (var con = new SqlConnection("some connection string"))
    using (var cmd = new SqlCommand("select * from orders", con))
    using (var rs = cmd.ExecuteReader())
    {
        while (rs.Read())
        {
           // ...
        }
    } 
    return orders;

} 

[转载]C#高效编程话题集1(每期10话题)

mikel阅读(841)

[转载]C#高效编程话题集1(每期10话题) – 不如来编码-luminji’s web – 博客园.

近来在小组C#快速成长团队 讨论了若干话题,有些感觉不错,特总结与大家分享。
当然,所谓话题,重点在于进行讨论,是否是最佳实践也属于大家的个人之见。以下观点若有差错,尽情蹂躏。
1:String str1 = “str1”+ 9; 和String str2 = “str2”+ 9.ToString(); 哪个效率高
可以知道“str1”+ 9,在运行时会完成一次装箱行为。9.ToString(),没有发生装箱行为,Int类型的ToString()方法的实际原型为:

public override String ToString() { return Number.FormatInt32(m_value, null, NumberFormatInfo.CurrentInfo); }

可能有人会问,那是不是原型中的Number.FormatInt32方法会发生装箱行为呢?实际Number.FormatInt32方法是一个非托管的方法,原型如下:

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical] public static extern string FormatInt32(int value, string format, NumberFormatInfo info);

它通过直接操作内存来进行int到string的转换,效率要比装箱高很多。
所以,答案是:后者
装箱为什么会带来性能损耗,因为它内部发生了太多事情:
1:首先,为值类型在托管堆中分配内存。内存总量除了值类型本身所分配的内存外,还要加上类型对象指针和同步块索引;
2:值类型的值复制到新分配的堆内存;
3:返回已经成为引用类型的对象的地址;
2:as,is转型比强制转型的优势

优势在于as,is 不抛出异常,如果转型失败,则返回null

强制转型则会抛出异常,导致代码必须处理异常,效率低。

值得注意的是,as只能转型基本类型,对于基本类别如int等的转型,只能使用强制转型或is。


3:readonly和const的区别或者说哪个更好

1:const天然就是static的,所以不能用static修饰;readonly无此限制;
2:const只能修饰基元类型;readonly无此限制;
3:const是编译期常量;readonly为运行期常量,其初始值除了在初始化器还可以在类型的构造函数中设定;
4:const经编译后,以实际值代替了变量(可查看IL验证),效率显然要高一些,可用到关键算法中,除此之外,与readonly比没有任何优势。
4:初始化器和构造器的异同
初始化器实际是语法糖,经编译后,它在构造函数的最开始执行。也就是说,初始化器可以理解为构造函数的一部分。
5:枚举在使用中的注意事项

1:如果不指定枚举的零值,会带来什么问题;

static Week week; static void Main(string[] args) { Console.WriteLine(week); }

即使未给week赋值,也会打印出零值。2:如果为枚举中的元素指定了相同的值,又会带来什么问题。

会导致相等型比较的时候出现与预期不符的结果
3:建议不给枚举显式指定值,但是如果枚举用于位运算则要为其元素指定2的指数幂值。
6:为什么LINQ语句都要开始于from而不是select
显而易见的原因是为了智能感知,要让他在输入LINQ查询的时候起作用,from子句就必须在最前面;如:
var AllCustomers = from Customer in db.Customers
select new { Customer.ContactName, Customer.Country };
7:dynamic可以用它来简化反射。
使用反射,调用方代码:

DynamicSample dynamicSample = new DynamicSample(); var addMethod = typeof(DynamicSample).GetMethod("Add"); int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });

在使用dynamic后,我们的代码看上去更简洁了,并且在可控的范围内减少了一次拆箱的机会:

dynamic dynamicSample2 = new DynamicSample(); int re2 = dynamicSample2.Add(1, 2);
8:foreach不能替代for的原因
1: 首先,对集合的每次增删操作(是不是全部集合?不得而知,但是起码是绝大部分集合),都会让集合的version字段+1,foreach采用的是迭代器 模式,每次迭代的时候都要判断version是不是保持一致,如果不一致,则抛出异常。而for没有这方面的限制。所以,采用

List<int> list = new List<int>() { 0, 1, 2, 3 }; foreach (int item in list) { list.Remove(item); Console.WriteLine(item.ToString()); }
会抛出异常,而改为for则不会。这是for不能被foreach取代叼的最重要原因。

2:foreach默认调用集合的迭代器的Dispose方法,如果该迭代器继承了IDispose方法的话。

9:区别IComparable<T>和IComparer<T>

前者IComparable<T>为类提供默认的比较器,而IComparer<T>可以为集合类提供更多的比较器。具体查看http://www.cnblogs.com/luminji/archive/2010/09/30/1839038.html
10:LINQ和比较器及迭代器优缺点比较

要进行排序和比较,传统的方式,存在两个问题:
1:可扩展性太低,如果存在新的排序要求,就得实现新的比较器;
2:对代码的侵入性太高,为类型继承了接口,增加了新的方法;
可参见博文的讨论:http://www.cnblogs.com/luminji/archive/2011/02/17/1956723.html

在我们自己的代码中强烈建议你利用LINQ带来便捷性,但我们仍需掌握比较器、迭代器、索引器的原理,以便我们更好地理解LINQ的思想,写出更加高质量的代码。

[转载]URL的井号

mikel阅读(1074)

[转载]URL的井号_IT新闻_博客园.

去年9月,twitter改版。

一个显著变化,就是URL加入了”#!”符号。比如,改版前的用户主页网址为

http://twitter.com/username

改版后,就变成了

http://twitter.com/#!/username

这是主流网站第一次将”#”大规模用于重要URL中。这表明井号(Hash)的作用正在被重新认识。本文根据HttpWatch的文章,整理与井号有关的所有重要知识点。

一、#的涵义

#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,

http://www.example.com/index.html#print

就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name=”print”></a>,二是使用id属性,比如<div id=”print”>。

二、HTTP请求不包括#

#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。

比如,访问下面的网址,

http://www.example.com/index.html#print

浏览器实际发出的请求是这样的:

GET /index.html HTTP/1.1

Host: www.example.com

可以看到,只是请求index.html,根本没有”#print”的部分。

三、#后的字符

在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。

比如,下面URL的原意是指定一个颜色值:

http://www.example.com/?color=#fff

但是,浏览器实际发出的请求是:

GET /?color= HTTP/1.1

Host: www.example.com

可以看到,”#fff”被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:

http://example.com/?color=%23fff

四、改变#不触发网页重载

单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。

比如,从

http://www.example.com/index.html#location1

改成

http://www.example.com/index.html#location2

浏览器不会重新向服务器请求index.html。

五、改变#会改变浏览器的访问历史

每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置。

这对于ajax应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。

值得注意的是,上述规则对IE 6和IE 7不成立,它们不会因为#的改变而增加历史记录。

六、window.location.hash读取#值

window.location.hash这个属性可读可写。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。

七、onhashchange事件

这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。

它的使用方法有三种:

window.onhashchange = func;

<body onhashchange=”func();”>

window.addEventListener(“hashchange”, func, false);

对于不支持onhashchange的浏览器,可以用setInterval监控location.hash的变化。

八、Google抓取#的机制

默认情况下,Google的网络蜘蛛忽视URL的#部分。

但是,Google还规定,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用”#!”,Google会自动将其后面的内容转成查询字符串_escaped_fragment_的值。

比如,Google发现新版twitter的URL如下:

http://twitter.com/#!/username

就会自动抓取另一个URL:

http://twitter.com/?_escaped_fragment_=/username

通过这种机制,Google就可以索引动态的Ajax内容。

[转载]深度解析Android样式

mikel阅读(698)

[转载]深度解析安卓样式 – 一尘 – 博客园.

如果你曾经是一名 WEB前台设计师,如果你曾经有过设计的功底,那么你很荣幸,如果你切到安卓平台中,以前的知识和经验都能很好的移植到安卓平台中。本人以为,学习是一个 长期的积累过程,经验很重要,为什么有的人不管做神马生意都赚钱,因为他有经验,经验加上变通,就是智慧。

布 局是根本,不管在WEB设计还是在手机客户端设计中,都是如此。如果一开始局就没有布好,就算你的细节做得再精美,到头来还是要重构。相比传统WEB设计 中的布局,安卓平台一样都不少,只是WEB设计的层布局,在安卓中有了个新的叫法,叫帧布局。布局在本篇中不是重点,因为和WEB中的概念几乎一样,所以 一笔带过。

说 实话,我还是比较喜欢WEB设计中的样式命名规范,简单,易用,最主要的是WEB的样式很好管理,不像安卓样式文件分得很细,看起来比较零乱。如果你研究 过SDK的设计方式,你会发现一个按钮的样式,分得很细,有btn_default.xml,btn_default_small.xml等二十几个样式 文件。

下面我们模仿SDK的设计方式,自定义一个按钮样式文件btn_default.xml,包含非焦点,焦点,pressed三种不同状态。

<!--?xml version="1.0" encoding="utf-8"?-->





selector可以理解为状态切换器,不同的状态下切换不同的样式,在传统WEB设计中就是伪类hover。shape意为定义按钮的形状。

样式的引用很简单,安卓统一把样式文件作为她的一种资源,下面是样式的使用方式。

<button>

</button>

效果

总结:

整体来说,安卓的样式设计非常的灵活,WEB设计中的大部分概念都适用于安卓平台,包括样式的继承概念。

[转载]深度解析Android样式

mikel阅读(878)

[转载]深度解析安卓样式 – 一尘 – 博客园.

如果你曾经是一名 WEB前台设计师,如果你曾经有过设计的功底,那么你很荣幸,如果你切到安卓平台中,以前的知识和经验都能很好的移植到安卓平台中。本人以为,学习是一个 长期的积累过程,经验很重要,为什么有的人不管做神马生意都赚钱,因为他有经验,经验加上变通,就是智慧。

布 局是根本,不管在WEB设计还是在手机客户端设计中,都是如此。如果一开始局就没有布好,就算你的细节做得再精美,到头来还是要重构。相比传统WEB设计 中的布局,安卓平台一样都不少,只是WEB设计的层布局,在安卓中有了个新的叫法,叫帧布局。布局在本篇中不是重点,因为和WEB中的概念几乎一样,所以 一笔带过。

说 实话,我还是比较喜欢WEB设计中的样式命名规范,简单,易用,最主要的是WEB的样式很好管理,不像安卓样式文件分得很细,看起来比较零乱。如果你研究 过SDK的设计方式,你会发现一个按钮的样式,分得很细,有btn_default.xml,btn_default_small.xml等二十几个样式 文件。

下面我们模仿SDK的设计方式,自定义一个按钮样式文件btn_default.xml,包含非焦点,焦点,pressed三种不同状态。

<!--?xml version="1.0" encoding="utf-8"?-->





selector可以理解为状态切换器,不同的状态下切换不同的样式,在传统WEB设计中就是伪类hover。shape意为定义按钮的形状。

样式的引用很简单,安卓统一把样式文件作为她的一种资源,下面是样式的使用方式。

<button>

</button>

效果

总结:

整体来说,安卓的样式设计非常的灵活,WEB设计中的大部分概念都适用于安卓平台,包括样式的继承概念。