1、String Split
在C#中,共有10个Split 的重载方法
大多数开发人员使用如下方法:
static void SplitChar()
{
var str = "Akshay|Patel";
var s1 = new Stopwatch();
s1.Start();
string[] temp = str.Split('|');
Console.WriteLine($"SplitChar ElapsedTicks:{s1.ElapsedTicks.ToString()}");
}
让我们改变一下,也就是说不直接传递字符,而是我们创建一个字符数组并将它们作为参数传递到Split方法
static void SplitCharArray()
{
var str = "Akshay|Patel";
var s2 = new Stopwatch();
s2.Start();
string[] temp = str.Split(new char[]{'|'});
Console.WriteLine($"SplitCharArray ElapsedTicks:{s2.ElapsedTicks.ToString()}");
}
运行程序并比较一下执行时间
结果表明使用第二种方法效率更高,更节省时间。
2、String Equals
在下面的代码中,我们检查str变量的值是否等于字符串“Akshay”。而且,不知道是什么原因,str的值为null。
static void Equals1()
{
try
{
string str = null;
Console.WriteLine(str.Equals("Akshay") ? "IF" : "ELSE");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
执行上面的代码,str.Equals 将会抛出一个空引用异常。
现在我们换一种方式思考,不使用str的Equals方法,而是使用“Akshay”的Equals方法
static void Equals2()
{
try
{
string str = null;
Console.WriteLine("Akshay".Equals(str) ? "IF" : "ELSE");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
在这个情况下,代码正确的执行,而不是抛出空指针异常
3、Adding Strings
在这里,我们对字符串插值(string interpolation),字符串格式化(string format),字符串连接(string concat)和字符串构建器(striing builder)进行基准测试
static void AddStrings()
{
string str = "Akshay";
string str1 = " Petal";
string result = string.Empty;
var s1 = new Stopwatch();
//String Interploation
s1.Start();
result = $"{str} {str1} is an author";
Console.WriteLine($"String Interpolation {s1.ElapsedTicks.ToString()}");
//String Format
s1.Restart();
result = string.Format("{0},{1} is an author", str, str1);
Console.WriteLine($"String Format {s1.ElapsedTicks.ToString()}");
//String Concat
s1.Restart();
result = string.Concat(str, str1, " is an auther");
Console.WriteLine($"String Concat {s1.ElapsedTicks.ToString()}");
//StringBuilder
s1.Restart();
StringBuilder sb = new StringBuilder();
sb.Append(str);
sb.Append(str1);
sb.Append(" is an auther");
result = sb.ToString();
Console.WriteLine($"StringBuilder {s1.ElapsedTicks.ToString()}");
}
通过采用四种不同的方法来添加两个字符串拼接起来,看一下基准测试结果。每次运行结果可能不同,有些差距还比较大,但是这四种方法中都是string Concat用时最少。
基准测试结果表明,建议使用string Concat方法进行字符串的拼接。
4、List.Count() Vs List.Any()
5、List.Count() Vs List.Count
很多时候,开发人员在迭代之前,使用List.Count()方法来检查lib是否有数据或者是否为空。在这里比较List.Count()和List.Any()方法的执行时间。
static void ListCountAndAny()
{
var watch = new Stopwatch();
var strs = new List<string>()
{
"Akshay",
"Patel",
"Panth",
"Patel"
};
watch.Start();
if (strs.Count() > 0) { }
Console.WriteLine($"List.Count() {watch.Elapsed}");
watch.Restart();
if (strs.Any()) { }
Console.WriteLine($"List.Any() {watch.Elapsed}");
watch.Restart();
if (strs.Count > 0) { }
Console.WriteLine($"List.Count {watch.Elapsed}");
}
通过执行时间来看,Count()方法比Any()方法节省时间。但是直接使用Count属性耗时更少。
这里与原作者给出的执行时间有出入,需要读者自行鉴别选用方法。
6、Array Length
通常,开发人员倾向于在for循环中使用Array.Length作为迭代的条件,但需要我们知道的是,每次迭代都会调用Length属性。最好将其存储在变量中并将该变量作为迭代条件
Array.Length in the loop
static void ArrayLengthInLoop()
{
var watch = new Stopwatch();
string[] names = new[] {"Akshay", "Patel", "Panth"};
watch.Start();
for (int i = 0; i < names.Length; i++)
{
}
Console.WriteLine($"Array.Length in the Loop: {watch.Elapsed}");
}
Array.Length in a Variable
static void ArrayLengthInVariable()
{
var watch = new Stopwatch();
string[] names = new[] { "Akshay", "Patel", "Panth" };
watch.Start();
int k = names.Length;
for (int i = 0; i < k; i++)
{
}
Console.WriteLine($"Array.Length in a Variable: {watch.Elapsed}");
}
基准测试结果