数组管理
数组共享问题稍微复杂一点。虽然数组也象其它变量一样可以在不同语言脚本之间共享,但必须注意
兼容方面的问题。
VBScript数组在JScript下可以用VBScript的符号引用,即用myArray(2)引用数组元素而不是JScript
的数组元素引用符号myArray[2]。此外,还可以使用一个特殊的JScript对象――VBArray对象将VBScript
数组转换为JScript数组。下面的代码从VBScript数组myVBArray创建JScript数组myJSArray:
var Temp = new VBArray(myVBArray)
var myJSArray
myJSArray = Temp.toArray()
上述代码首先创建一个临时的VBArray对象,然后使用它的toArray()方法将自己转换为JScript数组
。此后就可以象普通JScript数组一样使用myJSArray,如myJSArray[1]。但应当注意的是,toArray()方
法将把一个多维的VBArray转换为一维的JScript数组。
从VBScript中引用JScript数组更为复杂。虽然在VBScript中我们可以直接访问JScript数组相关的方
法和属性,但没有直接访问JScript数组的单个元素的方法。也就是说,我们可以在VBScript脚本中读取
JScript数组的长度属性,如下所示:
x = myJSArray.length
但无法直接读取该数组的单个元素,下面的VBScript代码是不正确的:
x = myJSArray(3)
解决该问题的一个可行的方法是执行一个转换过程,如下面的代码所示,此处假定VBScript是缺省的
脚本语言:
<%
Dim Temp
Dim myVBArray
Temp = myJSArray.join(", ")
myVBArray = Split(Temp, ", ")
%>
===================================================================
<HEAD>
<SCRIPT LANGUAGE="VBScript">
<!--
Function CreateVBArray()
Dim i, j, k
Dim a(2, 2)
k = 1
For i = 0 To 2
For j = 0 To 2
a(j, i) = k
document.writeln(k)
k = k + 1
Next
document.writeln("vbCRLF")
Next
CreateVBArray = a
End Function
-->
</SCRIPT>
<SCRIPT LANGUAGE="JScript">
<!--
function VBArrayTest(vbarray){
var a = new VBArray(vbarray);
var b = a.toArray();
var i;
for (i = 0; i < 9; i++)
{
document.writeln(b[i]);
}
}
-->
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JScript">
<!--
VBArrayTest(CreateVBArray());
-->
</SCRIPT>
</BODY>
此处的JScript join()方法将数组myJSArray元素转换到一个以逗号为分割符的字符串,VBScript
Split()函数将字符串转换为VBScript数组。注意这里我们是在VBScript环境下调用JScript的join方法。
依照此例,我们可以通过自定义VBScript函数来模拟JScript的VBArray对象的toArray()方法以实现
JScript数组到VBScript数组的转换。
========================================================================
Asp 数组的使用 [ 日期:2006-04-29 ] [ 来自:不详 ] 数组是有序数据的集合。数组中的元素
可以不属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素,更改其中一个元素
并不会影响其它元素。数组的下标是有界的,分为下界和上界。数组可以用Dim、Private、Public或
Static来声明,它们的语法格式相同。下面只介绍用Dim声明数组的方法。
1.数组的定义与声明
数组的定义语法如下:
Dim 数组名( [[下标下界 To ] 下标上界] ) [As 数据类型]
例如(假设在当前模块中 数组的缺省下界为0)):
① Dim A(10) As Integer
表示数组名为A,此数组下标下界为缺省值0,下标上界为10,有11个Integer类型的元素,从A(0)
、A(1)到A(10)。
② Dim B(1 To 20) As Integer
表示数组名为B,此数组下标下界为1,下标上界为20,有20个Integer类型的元素,从B(1)到B
(20)。
③Dim DayArray(50)
表示DayArray 是一个有 51 个索引(从 0 到 50)元素的 Variant 数组。
④Dim Matrix(3, 4) As Integer
表示Matrix 是一个二维 Integer 数组。
⑤Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double
表示MyMatrix 是一个显式指定了上下界的三维 double 数组。
⑥Dim BirthDay(1 To 10) As Date
表示BirthDay 是一个索引从 1 到 10 的 Date型 数组。
2.Option Base 语句
Option Base 语句在模块级别中使用,用来声明数组下标的缺省下界。
Option Base 语句的语法如下:
Option Base {0 | 1}
说明:缺省状态下数组下界为 0,此时无需使用 Option Base 语句。如果使用该语句规定数组下界1
,则必须在模块的数组声明之前使用Option Base 语句。
注意:
(1)Dim、Private、Public、ReDim 以及 Static 语句中的 To 子句提供了一种更灵活的方式来控制数
组的下标。不过,如果没有使用 To 子句显式地指定下界,则可以使用 Option Base 将缺省下界设为 1
。使用 Array 函数创建的数组的下界也受 Option Base 语句指定的下界的决定, 除非 Array 是由类型
库(例如 VBA.Array )名称限定,如果是由类型库名称限定,则 使用Array 函数创建的数组的下界不受
Option Base 的影响。
(1) Option Base 语句只影响位于包含该语句的模块中的数组下界。
关于数组声明的几点说明:
①数组名命名规则和变量名的相同。
②数组名后是用圆括弧括起来的,不能用方括弧,不同于C语言。
③下标的下界必须不能大于其上界。
④可以用变量名或常数名(以及实数)作下标的边界。当下标的边界是常数名时,数组的大小固定,当下
标的边界是变量名时,数组的大小可作动态定义,即数组的大小取决于程序运行过程中变量的值。因此,
VB 中数组又可以分为两种数组:静态数组、动态数组。
3.静态数组
静态数组是指数组元素的个数是固定不变的,即它们占用的内存空间大小是固定不变的。根据固定大小数
组的维数不同,可以将它分为一维数组和多维数组。
声明多维数组的语法格式为:
Dim 数组名([下标边界列表]) [As 数据类型]
下标边界的定义形式:[下标下界 To]下标上界
下标边界列表指用逗号分开的数组各维的下标边界,即
[下标下界 To]下标上界,[下标下界 To]下标上界,……,[下标下界 To]下标上界
(第一维) (第二维) (第n维)
当n=1时,数组称作一维数组;当n=2时,数组称作二维数组;依次类推,当n=m时,数组称作m维数组。
下面举例介绍一维数组的使用。
’声明一个长度为51的字符串数组FriendsName
Dim FriendsName(50) As String
’声明一个长度为11的全局整型数组Class
Public Class(10) As Integer
一维数组中的元素个数为(上界-下界+1)。
为数组赋初值可以采用循环语句,如:
Dim I As Integer
For I = 0 To 11 ’循环语句的使用程序流程的控制
C(I) = I
Next I
如果不显式指定下标下界,则数组的下标下界由 Option Base 语句控制。如果没有 Option Base 语
句则下界为默认为 0。
数组的维数并不限于2,在VB中,可以扩大至于60,在实际应用上对三维以上的数组的应用是不多的。定
义一个多维数组时只需一条Dim语句指定数组的所有下标边界即可,使用多维数组的可以很方便的表示一
些有意义的统计数据。例如:
Dim Profit(16,10,12) As Currency
这个Profit数组可用来表示以店名、部门及月份为参数的某百货公司的利润。如:Profit(2,8,11)代表了
第二分店的第八部门在11月份的利润。
4.动态数组
有时在数组开始使用前,不能知道需要多大的数组才能满足实际需要。当然可以把数组的大小定义到足够
大来满足任意的实际应用需要,这种方法效率很低(大量浪费内存空间)。如果使用动态数组,就可以在
程序运行时根据实际需要,精确定义数组的大小。
在声明数组时,不给出维数列表就是将数组声明为动态数组。例如:
Dim MyArry() As Integer
在使用动态数组前,必须使用ReDim语句把它重新定义。如前面声明的数组MyArry,可以用以下语句将它定
义为一个动态二维数组。
ReDim MyArry(10,10)
还可以通过重复执行ReDim语句,多次定义动态数组。使用ReDim最多能定义数组的维数是60。ReDim语句
可以改变数组每维的元素个数,但不能改变维数。下面是对ReDim语句的一个标准应用举例。
Dim MyArry() As Single ‘声明动态数组
ReDim MyArry(30,20,10) ‘重新定义数组
ReDim MyArry(50,23,21) ‘再次重新定义数组
ReDim的语法与Dim的相同,此外,它还有选择项Preserve关键词:
ReDim Preserve 数组名 ([ [下标下界 To]下标上界]) [As 数据类型]
例如:
ReDim MyArry(50,23,21)
ReDim Preserve MyArry(50,23,50)
注意:使用ReDim 时,重新定义数组会使所有数组元素的值消失,而使用Preserve可以保留数据。但是用
Preserve只能在改变数组的最后一维的大小时,保留数组的数据。对于一维数组来说,所有数据都会保留
,而对于多维数组:只能改变最后一维的大小,才能保留全部数组数据,否则出错。
5.LBound 函数和UBound 函数
LBound 函数和Ubound函数都是返回一个 Long 型数据,前者得到的值为指定数组维可用的最小下标,而
后者得到的是最大下标。它们的语法为:
LBound(数组名[, 指定的维数])
UBound(数组名[, 指定的维数])
其中数组名是必选的。指定的维数是可选的,表明指定返回哪一维的下界。1 表示第一维,2 表示第
二维,如此类推。如果省略指定的维数,就默认为是 1。
关于如何使用LBound 函数与 UBound 函数可参见下例:
Dim A(1 to 100,3,-3 to 4) As Integer ’定义一三维数组,假定没有使用Option Base 语
’句改变数组下界的默认值。
对数组A使用Lbound 和Ubound函数,其返回值列表如下
所有维的缺省下界取决于 Option Base 语句的设置。可以看出对一数组使用LBound 函数与 UBound 函数
,可用于确定一个数组中元素的个数。
对于那些在声明中用 To 子句来设定维数的数组而言,它们可以用任何整数作为下界而不受Option Base
语句的限制。
6.数组的高级功能
尽管数组最通常被用来存储成组的变量,但是在别的一些方面数组也是很有用的。可以将一个数组的内容
赋值给另一个数组、创建返回数组的函数,还可以创建返回数组的属性。在许多情况下,这些技术能改进
应用程序的性能。
正如可以将一个变量的值赋给另一个变量,例如 StrA = StrB ,也可以将一个数组的内容赋给另一个数
组。例如,要将一字节型数组从一个位置复制到另一个位置。可以通过每次复制一个字节来实现,程序如
下:
Sub ByteCopy(oldCopy() As Byte, newCopy() As Byte)
‘参数oldCopy()是源数组,newCopy()是目标数组
Dim i As Integer
ReDim newCopy (Lbound(oldCopy) To UBound(oldCopy)) ’重新定义动态数组
For i = Lbound(oldCopy) To Ubound(oldCopy) ’循环赋值
newCopy(i) = oldCopy(i)
Next
End Sub
一个更有效的简单的方法就是直接将一个数组赋给另外一个数组:
Sub ByteCopy(oldCopy() As Byte, newCopy() As Byte)
‘参数oldCopy()是源数组,newCopy()是目标数组
newCopy = oldCopy ’利用数组直接进行赋值
End Sub
关于变量赋值有一些规则需要铭记。例如,虽然可以将一个声明为整型的变量赋给一个声明为长整型的变
量而不会产生任何问题,但是将一个长整型变量赋给一个整型变量就很容易导致溢出错误。除了遵守有关
数据类型变量之间赋值时的规则外,数组赋值还要遵从另外一些规则,包括数组维数,每一维的大小,以
及数组是固定的还是动态的。
①维数、数据类型不同的数组赋值考虑的几个因素
l 赋值符左边的数组类型:固定数组 (Dim x(1 to 10) As Integer) 或者动态数组 (Dim x()
As Integer)。
l 赋值符左边数组的维数是否和赋值符右边数组的维数匹配。
l 赋值符两边数组的每一维的数组元素个数是否匹配。即使数组的声明不同,维数也可能匹配。
比如一个数组的每一维元素从 0 开始编号而另一个则从 1 开始,维数也可能匹配。
l 赋值符两边所有元素的数据类型必须是相容的。这些规则和变量赋值的规则是一致的。
表3-6显示了这些因素的影响:
数组赋值时的错误可能发生在编译时,也可能发生在运行时(例如,如果数据类型不能强制转换或赋值试
图重新声明 (ReDim) 一个静态数组)。设计程序时要添加错误处理以确保数组在赋值之前是匹配的。
②编写返回数组的函数
从一个函数返回一组值是可能实现的。例如,从一个函数返回一组字节而不必将其先转换为一个字符串然
后再转换回来。
下面是一个使用返回字节数组的函数的简单示例:
Private Sub Form_Load()
Dim b As Byte
Dim i As Integer
Dim ReturnArray() As Byte
b = Cbyte(54)
ReturnArray() = ArrayFunction(b) ’调用函数
For i = Lbound(ReturnArray) To Ubound(ReturnArray)
Msgbox ReturnArray(i) ’通过弹出消息框循环显示数组值
Next
End Sub
Public Function ArrayFunction(b As Byte) As Byte()
Dim x(2) As Byte
x(0) = b
x(1) = b + CByte(200)
x(2) = b + b
ArrayFunction = x ’返回结果为数组x
End Function
在运行以上示例后, ReturnArray() 是一个三元素数组,其中包含了分配给 ArrayFunction 中数组的值
。ArrayFunction 语句将一个数组作为参数传递;且数组的数据类型必须和函数的数据类型相同(在本例
中是字节)。因为这是一个函数调用,传递数组时不必带括号。
注意:
1.尽管可以通过赋值给另一个数组(ArrayFunction = x())来返回一个数组,但出于性能方面的考虑,
并不推荐使用这种方法。
2.必须为返回数组的函数指定一个类型,这个类型可以是 Variant。这样一来,Function X() As
Variant() 是有效的而 Function X() As () 将失败。
3.当调用一个返回数组的函数时,用来保存返回值的变量也必须是一个数组,而且其数据类型必须和函
数返回类型相同,否则将显示一个“类型不匹配”的错误。
// statements_if_else2.cs
// else-if
using System;
public class IfTest
{
static void Main()
{
Console.Write("Enter a character: ");
char c = (char)Console.Read();
if (Char.IsUpper(c))
{
Console.WriteLine("Character is uppercase.");
}
else if (Char.IsLower(c))
{
Console.WriteLine("Character is lowercase.");
}
else if (Char.IsDigit(c))
{
Console.WriteLine("Character is a number.");
}
else
{
Console.WriteLine("Character is not alphanumeric.");
}
}
}
C# DateTime日期类型格式化显示
1.绑定时格式化日期方法:
<ASP:BOUNDCOLUMN DATAFIELD= "JoinTime " DATAFORMATSTRING= "{0:yyyy-MM-dd} " >
<ITEMSTYLE WIDTH= "18% " > </ITEMSTYLE >
</ASP:BOUNDCOLUMN >
2.数据控件如DataGrid/DataList等的件格式化日期方法:
e.Item.Cell[0].Text = Convert.ToDateTime(e.Item.Cell[0].Text).ToShortDateString();
3.用String类转换日期显示格式:
String.Format( "yyyy-MM-dd ",yourDateTime);
4.用Convert方法转换日期显示格式:
Convert.ToDateTime("2005-8-23").ToString
("yyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo); //支持繁体数据库
5.直接用ToString方法转换日期显示格式:
DateTime.Now.ToString("yyyyMMddhhmmss");
DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")
6.只显示年月
DataBinder.Eval(Container.DataItem,"starttime","{0:yyyy-M}")
7.显示时间所有部分,包括:年月日时分秒
<asp:BoundColumn DataField="收款时间" HeaderText="收款时间"
DataFormatString="{0:yyyy-MM-dd HH24:mm:ss}">
</asp:BoundColumn>