避免在LINQ中使用不必要的查询
在LINQ查询中,避免不必要的迭代
MyList:
class MyList : IEnumerable<Person> { List<Person> listPerson = new List<Person>() { new Person(){Name = "Mike",Age = 23}, new Person(){Name = "Mike",Age = 13}, new Person(){Name = "Lucyee",Age = 53}, new Person(){Name = "Uyiasdn",Age = 63}, new Person(){Name = "Oiasdn",Age = 26}, new Person(){Name = "Poundhby",Age = 43} }; /// <summary> /// 迭代次数属性 /// </summary> public int IteratedNum { get; set; } public Person this[int i] { get { return listPerson[i]; } set { this.listPerson[i] = value; } } public IEnumerator<Person> GetEnumerator() { foreach(var item in listPerson) { IteratedNum++; yield return item; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
主程序:
Console.WriteLine("Hello World!"); MyList list = new MyList(); var temp1 = (from a in list where a.Age == 13 select a).ToList(); // 查询满足条件的所有数据 Console.WriteLine(list.IteratedNum.ToString()); // 输出6 Console.WriteLine(); list.IteratedNum = 0; var temp2 = (from a in list where a.Age >= 10 select a).First(); // 查询满足条件的第一个数据 Console.WriteLine(list.IteratedNum.ToString()); // 输出1 Console.WriteLine(); list.IteratedNum = 0; var temp3 = (from a in list select a).Take(2).ToList(); Console.WriteLine(list.IteratedNum.ToString()); // 输出2 Console.WriteLine(); list.IteratedNum = 0; var temp4 = (from a in list where a.Name == "Mike" select a).ToList(); Console.WriteLine(list.IteratedNum.ToString()); // 输出6
在这里,我认为的是First()和Take()只是做了对应的处理,只拿出这么点数据。不需要对后面的集合进行遍历,因为First语句的意思就是拿第一条数据,Take的意思就是拿多少条数据。并不会对后面进行遍历。
在这里不能看出与where的对比,因为where本身就要访问所有数据且拿出满足条件的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】