先说需求:找出一个对象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.查看运行结果:
首先两种方式都找到了最大值,用第一种方式基本上花费时间为第二种的四到五倍。