String类
-
字符串的特性
String类用来比较两个字符串、查找和抽取串中的字符或子串。
string可以看做是char的只读数组。
C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。
注意:对该类对象的任何操作都将返回一个新的字符串对象 除了Clone Clone直接将该字符串的引用返回了示例:
String s1 = “a”;
String s2 = s1 + “b”;
Console.WriteLine(Object.ReferenceEquals (s1,s2));谁说字符串不可变?string s = “abc”;s=”123“;,s这不是变了吗
要区分变量名和变量指向的值的区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。
string s10 = s;//s10指向s指向的字符串,而不是s10指向s,哪怕s以后指向了其他内存,那么s10还是指向从前s指向的字符串。 -
字符串的构造
String s = “abc”;
String s = new String(“fgh”.ToCharArray());
String copyS = String.Copy(s);
String newS = s.Clone() as String; -
字符串的遍历
字符串是一个字符数组
所以可以用遍历数组的方式遍历字符串的每一个位子的字符示例:
- 1
- 2
- 3
- 4
- 5
注意:
字符串中的字符位置和数组一样从下标0开始
字符串和数组一样有Length属性
字符串和数组一样可以按索引的方式访问 -
字符串的大小写转换
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 字符串的截取
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 字符串的分割
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 字符串的替换
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 字符串的查询
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 字符串与ascii的转换
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 字符串的格式化
- 1
- 2
- 3
- 4
- 5
- 6
- 字符串比较
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
字符串比较的在早期博客中已经写过了,并且有程序优化过程及思路大家可以参考此博文字符串比较的逻辑
- 去除空格
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
自己实现的逻辑
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
StringBuilder学习
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
String和StringBuilder的区别
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
上图为string进行100次拼接的时候耗时为:0.00064秒
上面的图为string进行100000次拼接时累计消耗的时间是22.57秒
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
上图为StringBuilder进行100次拼接时的耗时:0.00090秒 相对来说不如string操作的快。
上图为StringBuilder进行100000次拼接时的结果是0.025秒,结果是明显优于string的100000次拼接的
总结
结果上面的图分析,我们在进行少量字符串的拼接的时候使用string来说比较优,但是我们在进行次数为万级的操作的时候我们可以所选用StringBuilder相对来说更优
DateTime结构
在项目开发中,经常会碰到日期处理。比如查询中,可能会经常遇到按时间段查询,有时会默认取出一个月的数据。当我们提交数据时,会需要记录当前日期,等等。下面就看看一些常用的方法。
首先,DateTime是一个struct。很多时候,会把它当成一个类。但它真的不是,MSDN上的描述如下:
DateTime结构:表示时间上的一刻,通常以日期和当天的时间表示。语法:
[SerializableAttribute] public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>
MSDN连接:MSDN DateTime结构
一、DateTime.Now属性
实例化一个DateTime对象,可以将指定的数字作为年月日得到一个DateTime对象。而DateTime.Now属性则可获得当前时间。如果你想按年、月、日分别统计数据,也可用DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day获取。同理,当前的时分秒也可以这样的方式获取。还可以在当前时间加上一个段时间等操作。
static void Main(string[] args) { DateTime newChina = new DateTime(1949, 10, 1); Console.WriteLine(newChina); Console.WriteLine("当前时间:"); Console.WriteLine("{0}年,{1}月,{2}日",DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); Console.WriteLine("{0}时,{1}分, {2}秒",DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); Console.WriteLine("三天后:{0}",DateTime.Now.AddDays(3)); Console.ReadLine(); }
结果:
二、ToString方法
DateTime的ToString方法有四种重载方式。其中一个重载方式允许传入String,这就意味着你可以将当前DateTime对象转换成等效的字符串形式。比如我们将当前时间输出,日期按yyyy-mm-dd格式,时间按hh:mm:ss格式。
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd")); Console.WriteLine(DateTime.Now.ToString("hh:mm:ss"));
还有一个重载形式是需要提供IFormatProvider,使用指定的区域性特定格式信息将当前 DateTime 对象的值转换为它的等效字符串表示形式。
static void Main(string[] args) { CultureInfo jaJP = new CultureInfo("ja-JP"); jaJP.DateTimeFormat.Calendar = new JapaneseCalendar(); DateTime date1 = new DateTime(1867, 1, 1); DateTime date2 = new DateTime(1967, 1, 1); try { Console.WriteLine(date2.ToString(jaJP)); Console.WriteLine(date1.ToString(jaJP)); } catch (ArgumentOutOfRangeException) { Console.WriteLine("{0:d} is earlier than {1:d} or later than {2:d}", date1, jaJP.DateTimeFormat.Calendar.MinSupportedDateTime, jaJP.DateTimeFormat.Calendar.MaxSupportedDateTime); } Console.ReadLine(); }
结果:
没太明白,日本历史那么短?百度了一下1868年9月8日,明治维新以后了。
付DateTimeFormatInfo类, 这里有比较全的时间日期格式对应的字符串。
三、DaysInMonth方法及IsLeapYear方法
DaysInMonth方法需要两个Int32型参数,返回指定年份指定月份的天数。关于月份的天数,多数只有2月需要特殊照顾一下。剩余的月份,无论哪一年的天数都是固定的。而二月呢,不但不是其他月份的30天或31天,她还分个闰年非闰年。
static void Main(string[] args) { Console.WriteLine("2000年至2015年中二月的天数"); for (int i = 2000; i < 2015; i++) { Console.WriteLine("{0}年2月有:{1}天", i, DateTime.DaysInMonth(i, 2)); } Console.ReadLine(); }
输出结果:
从输出结果中可以看出,2月为29天的年份为闰年。但其实DateTime还提供了判断闰年的方法IsLeapYear,该方法只要一个Int32的参数,若输入的年份是闰年返回true,否则返回false。(.Net Framework就是这么贴心,你要的东西都给你封装好了,直接拿来用好了。)要是没这个方法呢,得自己去按照闰年的规则去写个小方法来判断。
static void Main(string[] args) { Console.WriteLine("2000年至2015年中二月的天数"); for (int i = 2000; i < 2015; i++) { if (DateTime.IsLeapYear(i)) Console.WriteLine("{0}年是闰年,2月有{1}天", i, DateTime.DaysInMonth(i, 2)); else Console.WriteLine("{0}年是平年,2月有{1}天",i,DateTime.DaysInMonth(i,2)); } Console.ReadLine(); }
微软现在已经将.NetFramework开源了,这意味着可以自己去查看源代码了。附上DateTime.cs的源码链接,以及IsLeapYear方法的源代码。虽然仅仅两三行代码,但在实际开发中,你可能一时间想不起闰年的计算公式,或者拿捏不准。封装好的方法为你节省大量时间。
// Checks whether a given year is a leap year. This method returns true if // year is a leap year, or false if not. // public static bool IsLeapYear(int year) { if (year < 1 || year > 9999) { throw new ArgumentOutOfRangeException("year", Environment.GetResourceString("ArgumentOutOfRange_Year")); } Contract.EndContractBlock(); return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); }
总结
介绍了几个算是比较常用的方法。在自己的项目中遇到日期操作的时候,多看看.NetFramework给我们提供了什么样的方法。很多时候用所提供的方法拼凑一下,就能轻易的获取到我们想要的日期或者时间。
Math类
Abs 返回指定数字的绝对值。
Acos 返回余弦值为指定数字的角度。
Asin 返回正弦值为指定数字的角度。
Atan 返回正切值为指定数字的角度。
Atan2 返回正切值为两个指定数字的商的角度。
BigMul 生成两个 32 位数字的完整乘积。
Ceiling 返回大于或等于指定数字的最小整数。
Cos 返回指定角度的余弦值。
Cosh 返回指定角度的双曲余弦值。
DivRem 计算两个数字的商,并在输出参数中返回余数。
Exp 返回 e 的指定次幂。
Floor 返回小于或等于指定数字的最大整数。
IEEERemainder 返回一指定数字被另一指定数字相除的余数。
Log 返回指定数字的对数。
Log10 返回指定数字以 10 为底的对数。
Max 返回两个指定数字中较大的一个。
Min 返回两个数字中较小的一个。
Pow 返回指定数字的指定次幂。
Round 将值舍入到最接近的整数或指定的小数位数。
Sign 返回表示数字符号的值。
Sin 返回指定角度的正弦值。
Sinh 返回指定角度的双曲正弦值。
Sqrt 返回指定数字的平方根。
Tan 返回指定角度的正切值。
Tanh 返回指定角度的双曲正切值。
Truncate 计算一个数字的整数部分。
E 表示自然对数的底,它由常数 e 指定。
PI 表示圆的周长与其直径的比值,它通过常数 n 指定。