关于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的效率问题的主要内容,如果未能解决你的问题,请参考以下文章

从我的 LINQ to SQL 中调用 UDF 和 sproc 的效率如何?

Linq的执行效率及优化

关于linq/lambda中如何使用DataDiff的问题

我错过了一些关于 LINQ 的东西吗?

关于LINQ字段不同类型做映射问题!

关于Linq左连接[重复]