c#List<T>四种查询方式的效率对比
2017-03-23 12:59
609 查看
对List进行查询的时候,会有多种方法供我们使用,但是在追求代码简洁和效率的情况下,哪种方法才是我们的最优选择呢?
先把我的测试结果摆出了吧~
for的效率是最高的,但是再兼顾行数和效率的情况下首选Find
2.测试List
foreach
Find
FirstOrDefault
先把我的测试结果摆出了吧~
测试结果
查询方式/单位(ms) | Debug模式 | Release模式 |
---|---|---|
for | 4.2 | 1.6 |
foreach | 7 | 3.2 |
FirstOrDefault | 11 | 9 |
Find | 4.4 | 1.8 |
测试内容
1.计算程序的运行时间//用Stopwatch类(System.Diagnostics)计算耗时 static void SubTest() { Stopwatch sw = new Stopwatch(); sw.Start(); //耗时巨大的代码 sw.Stop(); TimeSpan ts2 = sw.Elapsed; Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds); }
2.测试List
public class model { public string name { set; get; } public int age { set; get; } } List<model> list=new List<model>();
List查询方法
forint myage ; for (int i = 0; i < list.Count; i++) { if (list[i].name == "小明") myage = list[i].age; }
foreach
int myage ; foreach(model m in list) { if(m.name=="小明") myage = m.age; }
Find
int myage = list.Find(x => x.name == "小明").age;
FirstOrDefault
int myage = list.FirstOrDefault(s => s.name == "小明").age;
完整代码
public partial class Form1 : Form { List<model> list; model p1,p2; /// <summary> /// for的方式查询 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { int count = 0; int myage; Stopwatch sw = new Stopwatch(); sw.Start(); while (count < 100000)//计算循环100000次的耗时 { for (int i = 0; i < list.Count; i++) { if (list[i].name == "小明")myage = list[i].age; } count++; } sw.Stop(); TimeSpan ts2 = sw.Elapsed; Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds); } /// <summary> /// foreach的方式查询 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { int count = 0; int myage; Stopwatch sw = new Stopwatch(); sw.Start(); while (count < 100000) { foreach(model m in list) { if(m.name=="小明") myage = m.age; } count++; } sw.Stop(); TimeSpan ts2 = sw.Elapsed; Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds); } /// <summary> /// Find的方式查询 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { int count = 0; int myint; Stopwatch sw = new Stopwatch(); sw.Start(); while (count < 100000) { myint = list.Find(x => x.name == "小明").age; count++; } sw.Stop(); TimeSpan ts2 = sw.Elapsed; Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds); } /// <summary> /// FirstOrDefault的方式查询 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button4_Click(object sender, EventArgs e) { int count=0; int myage; Stopwatch sw = new Stopwatch(); sw.Start(); while (count < 100000) { myage = list.FirstOrDefault(s => s.name == "小明").age; count++; } sw.Stop(); TimeSpan ts2 = sw.Elapsed; Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds); } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { p1 = new model(); p1.name = "小红"; p1.age = 10; p2 = new model(); p2.name = "小明"; p2.age = 23; list = new List<model>(); list.Add(p1); list.Add(p2); } } public class model { public string name { set; get; } public int age { set; get; } }
相关文章推荐
- C#.Net:List<T>集合列表的Linq语句查询示例
- C#常见的几种集合 ArrayList,Hashtable,List<T>,Dictionary<K,V> 遍历方法对比
- C# List<T>使用方式
- C#中的[],Array,List<>,ArrayList的区别
- c#中List<T>find使用示例
- .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
- C#.NET IDataReader扩展 ToList<T>/Get<T>
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- [测试]Gridview绑定SqlDataReader+IList<T>和SqlDataAdapter+DataSet的效率
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- C# List<T>.Sort排序
- [C#]Array.Sort和List<T>.Sort的委托版本比IComparer版本效率低
- c#简单实现二维数组和二维数组列表List<>的转置
- [C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- C#研究系列-List<>与ArrayList的几个研究心得及问题(上)
- java 调用 c# webservice 压缩 List<string>示例
- 逐步认识C#四种判断相等的方法<转载>
- C#.NET的Linq查询、lambda、委托:Func<>和Action
- 数据结构复习:用自己的方式实现List<T>(4/1晨更新)
- C#中string[]数组和list<string>泛型的相互转换