{
Dictionary<string, string> urlparameters = new Dictionary<string, string>();
for (int i = 0; i < 100000; i++)
{
urlparameters.Add(i.ToString(),i.ToString());
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var a = SortWay1(urlparameters);
Console.WriteLine("linq排序时间:"+stopwatch.Elapsed.TotalSeconds);
stopwatch.Reset();
stopwatch.Start();
var b = SortWay1(urlparameters);
Console.WriteLine("SortedDictionary排序时间:" + stopwatch.Elapsed.TotalSeconds);
stopwatch.Reset();
stopwatch.Stop();
}
public string SortWay1(IDictionary<string, string> dic)
{
IOrderedEnumerable<KeyValuePair<string,string>> dicc
= from entry in dic orderby dic.Keys select entry;
var sign = "";
foreach (var item in dicc)
{
sign += item.Key + item.Value;
}
return sign;
}
public string SortWay2(IDictionary<string, string> dic)
{
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(dic);
IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
var query = "";
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
query += dem.Current.Key + dem.Current.Value;
}
}
return query;
}
输出结果:
1万条数据
linq排序时间:0.5134289
SortedDictionary排序时间:0.4398414
//修改使用 stringbuilder
public void Test()
{
var today = DateTime.Today.ToString("yyyy-MM-dd");
Directory.CreateDirectory(string.Format(@"C:/1/2", today));
}
public void TestLinqSort()
{
Dictionary<string, string> urlparameters = new Dictionary<string, string>();
for (int i = 0; i < 1000000; i++)
{
urlparameters.Add(i.ToString(),i.ToString());
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var a = SortWay1(urlparameters);
Console.WriteLine("linq排序时间:"+stopwatch.Elapsed.TotalSeconds);
stopwatch.Reset();
stopwatch.Start();
var b = SortWay1(urlparameters);
Console.WriteLine("SortedDictionary排序时间:" + stopwatch.Elapsed.TotalSeconds);
stopwatch.Reset();
stopwatch.Stop();
}
public string SortWay1(IDictionary<string, string> dic)
{
IOrderedEnumerable<KeyValuePair<string,string>> dicc
= from entry in dic orderby dic.Keys select entry;
var stringbuilder = new StringBuilder();
foreach (var item in dicc)
{
stringbuilder.Append(item.Key).Append(item.Value);
}
return stringbuilder.ToString();
}
public string SortWay2(IDictionary<string, string> dic)
{
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(dic);
IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
var stringbuilder = new StringBuilder();
while (dem.MoveNext())
{
string key = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
stringbuilder.Append(dem.Current.Key).Append(dem.Current.Value);
}
}
return stringbuilder.ToString();
}
输出结果 :
100万条数据
linq排序时间:0.5365147
SortedDictionary排序时间:0.4856324
注:
三者在执行速度方面的比较:StringBuilder >StringBuffer > String
String一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储
而StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。因此:当需要进行频繁修改字符串的操作时先建立StringBuffer类对象进行操作,将最后结果转化成String类对象返回,这样效率会高很多。
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)