关于linq的效率问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于linq的效率问题相关的知识,希望对你有一定的参考价值。
闲来无事,就写了一个简单的代码,想看看linq的查询效率 代码如下:
Random rd = new Random();
List<ConnectionSocket> csVos = new List<ConnectionSocket>();
for (int i = 0; i < 10000; i++)
ConnectionSocket csnVo = new ConnectionSocket();
csnVo.Camps = i;
csVos.Add(csnVo);
DateTime now = DateTime.Now;
List<ConnectionSocket> tcsVos = new List<ConnectionSocket>();
for (int i = 0; i < 10000; i++)
int test1 = rd.Next(10000);
var va = from n in csVos where n.Camps == test1 select n;
if (va.Any())
tcsVos.Add(va.ElementAt(0));
DateTime end = DateTime.Now;
double temp = (end - now).TotalMilliseconds;
DateTime now1 = DateTime.Now;
List<ConnectionSocket> tcsVos1 = new List<ConnectionSocket>();
for (int i = 0; i < 10000; i++)
int test1 = rd.Next(10000);
for (int j = 0; j < csVos.Count; j++)
if (csVos[j].Camps == test1)
tcsVos1.Add(csVos[j]);
break;
DateTime end1 = DateTime.Now;
int temptest = 0;
double temp1 = (end1 - now1).TotalMilliseconds;
结果 temp 的值在2800-3000左右,temp1的值在870-900左右,为什么我用老的循环查询速度要比linq快呢,还是我linq的用发错误了??有大神可以解答下不??
在一个10000次的循环中,直接使用Linq效率肯定不会高的。因为每次循环中都需要构造
var va = from n in csVos where n.Camps == test1 select n
----------
采用Linq动态扩展方法,效率肯定比原来的Linq更好些
DateTime now = DateTime.Now;List<ConnectionSocket> tcsVos = new List<ConnectionSocket>();
for (int i = 0; i < 10000; i++)
int test1 = rd.Next(10000);
ConnectionSocket item = csVos.FirstOrDefault(o=>o.Camps==test1);
//var va = from n in csVos where n.Camps == test1 select n;
//if (va.Any())
if(item != null)
tcsVos.Add(item);
DteTime end = DateTime.Now;
double temp = (end - now).TotalMilliseconds; 参考技术A class Program
static void Main(string[] args)
List<Student> stuList_A = new List<Student>();
for (int i = 0; i < 1000; i++)
Student stu = new Student();
stu.ID = i;
stu.Name = "Name" + i.ToString();
stuList_A.Add(stu);
// use linq
Random r = new Random();
int order = 0;
List<Student> stuList_B = new List<Student>();
DateTime dt = DateTime.Now;
for (int i = 0; i < 1000; i++)
order = r.Next(1000);
//Student stu = stuList_A.Single((s) => return s.ID == i; );
//上面一行要慢好多,是因为它要找完整个集合 也是就在第二个 for 语句中没有break 它要直到完成
Student stu = stuList_A.Find((s) => return s.ID == i; );//这里只要找到这一个就行了。所以它有break;
stuList_B.Add(stu);
var timeSpan = (DateTime.Now - dt).TotalMilliseconds;
Console.WriteLine("UseLinq"+timeSpan);//结果是 UserLinq 29.****
stuList_B = new List<Student>();
dt = DateTime.Now;
for (int i = 0; i < 1000; i++)
order = r.Next(1000);
for (int j = 0; j < stuList_A.Count; j++)
if (stuList_A[j].ID == order)
stuList_B.Add(stuList_A[j]);
break;
timeSpan = (DateTime.Now - dt).TotalMilliseconds;
Console.WriteLine("UseFor" + timeSpan);//结果是 UseFor 16.***
Console.ReadKey();
public class Student
public int ID;
public string Name;
总结: Linq 也是对一般for 的一个封装。只有知道每一个封装的不同才可以达到Linq的设计目标
1、精简
2、高效
关于linq/lambda中如何使用DataDiff的问题
//首先linq是不支持DateTime.DateDiff的,会报错,可以用SqlFunctions.DateDiff代替,与sql语法一样
//示例如下
获取当天登录过的用户列表
var gameList = this.dbUsers.Where(t => SqlFunctions.DateDiff("day",t.UpdateTime.Value,DateTime.Now)==0).ToList();
以上是关于关于linq的效率问题的主要内容,如果未能解决你的问题,请参考以下文章