先说需求:找出一个对象List中,某个属性值最大的对象。
1.定义对象
1 private class A 2 { 3 public int ID { get; set; } 4 5 public string Name { get; set; } 6 }
2.为两种方法定义两个时间段全局变量。
1 private static TimeSpan compare = new TimeSpan(); 2 private static TimeSpan order = new TimeSpan();
3.第一种方法:对列表按照某一列倒序排列取出第一个对象。
private static void MaxByOrder(List<A> list) { Stopwatch sw = new Stopwatch();
sw.Start();
A max = list.OrderByDescending(i => i.ID).First();
sw.Stop();
order += sw.Elapsed;
Console.WriteLine(max.Name + " Order:" + sw.Elapsed.ToString());
}
4.第二种方法:先找出列表中某个属性的最大值,然后在列表中取出第一个与最大值相等的对象。
private static void Max(List<A> list)
{
Stopwatch sw = new Stopwatch();
sw.Start(); int maxID = list.Max(m => m.ID);
A max = list.First(i => i.ID == maxID);
sw.Stop();
compare += sw.Elapsed;
Console.WriteLine(max.Name + " Compare:" + sw.Elapsed.ToString());
}
5.Main方法:生成测试列表,并循环调用两个方法100次,打印每种方法所用时间。
1 private static void Main(string[] args) 2 { 3 List<A> list = new List<A>(); 4 list = Enumerable.Range(1, 10000000).Select(n => new A { ID = n, Name = n.ToString() }).ToList(); 5 Console.WriteLine("print"); 6 int i = 0; 7 while (i < 100) 8 { 9 MaxByOrder(list); 10 Max(list); 11 i++; 12 } 13 Console.WriteLine("Compare:" + compare); 14 Console.WriteLine("Order:" + order); 15 Console.ReadLine(); 16 }
6.查看运行结果:
首先两种方式都找到了最大值,用第一种方式基本上花费时间为第二种的四到五倍。
ok,今天就先到这,希望大家拍砖……