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}");
}
基準測試結果