什么时候应该使用一个列表VS在LinkedList [英] When should I use a List vs a LinkedList

查看:187
本文介绍了什么时候应该使用一个列表VS在LinkedList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当是它更好地使用名单(对T) VS一个的LinkedList(Of T)已

解决方案

修改

  

请阅读注释这个答案。人声称我没有做   正确的测试。我同意这不应该是一个公认的答案。因为我是   学习我做了一些测试,感觉就像分享。

原来的答复...

我发现了有趣的结果:

  //临时类,显示的例子
一流的温度
{
    公共十进制A,B,C,D;

    公众温度(十进制一,十进制B,小数C,十进制D)
    {
        A = A; B =; C = C; D = D组;
    }
}
 

链表(3.9秒)

 的LinkedList<温度>名单=新的LinkedList<温度>();

        对于(VAR I = 0; I< 12345678;我++)
        {
            VAR一个=新的温度(我,我,我,我);
            list.AddLast(一);
        }

        小数总和= 0;
        的foreach(在列表VAR项)
            总和+ = item.A;
 

列表(2.4秒)

 名单,其中,温度>名单=新的名单,其中,温度>(); //2.4秒

        对于(VAR I = 0; I< 12345678;我++)
        {
            VAR一个=新的温度(我,我,我,我);
            list.Add(一);
        }

        小数总和= 0;
        的foreach(在列表VAR项)
            总和+ = item.A;
 

即使您只能访问基本的数据它会非常慢!! 我说从来没有使用一个链表。




下面是执行大量插入(我们计划在列表的中间插入一个项目),另一种比较

链表(51秒),

 的LinkedList<温度>名单=新的LinkedList<温度>();

        对于(VAR I = 0; I< 123456;我++)
        {
            VAR一个=新的温度(我,我,我,我);

            list.AddLast(一);
            VAR CURNODE = list.First;

            为(变种K = 0; K&所述;的i / 2; k ++)//为了在列表的中间插入一个节点,我们需要找到它
                CURNODE = curNode.Next;

            list.AddAfter(CURNODE,一); //后面插入它
        }

        小数总和= 0;
        的foreach(在列表VAR项)
            总和+ = item.A;
 

列表(7.26秒)

 名单,其中,温度>名单=新的名单,其中,温度>();

        对于(VAR I = 0; I< 123456;我++)
        {
            VAR一个=新的温度(我,我,我,我);

            list.Insert(ⅰ/ 2,一);
        }

        小数总和= 0;
        的foreach(在列表VAR项)
            总和+ = item.A;
 

有位置的参考,其中插入(0.04秒)链表

  list.AddLast(新的温度(1,1,1,1));
        VAR referenceNode = list.First;

        对于(VAR I = 0; I< 123456;我++)
        {
            VAR一个=新的温度(我,我,我,我);

            list.AddLast(一);
            list.AddBefore(referenceNode,一);
        }

        小数总和= 0;
        的foreach(在列表VAR项)
            总和+ = item.A;
 

所以,如果你打算插入几个项目和您也只有的地方都在这里你打算插入的项目,然后用链表的参考。仅仅因为你需要插入大量的项目更快,因为搜索,你会喜欢它插入位置需要一定的时间它没有。

When is it better to use a List(Of T) vs a LinkedList(Of T)?

解决方案

Edit

Please read the comments to this answer. People claim I did not do proper tests. I agree this should not be an accepted answer. As I was learning I did some tests and felt like sharing them.

Original answer...

I found interesting results:

// Temporary class to show the example
class Temp
{
    public decimal A, B, C, D;

    public Temp(decimal a, decimal b, decimal c, decimal d)
    {
        A = a;            B = b;            C = c;            D = d;
    }
}

Linked list (3.9 seconds)

        LinkedList<Temp> list = new LinkedList<Temp>();

        for (var i = 0; i < 12345678; i++)
        {
            var a = new Temp(i, i, i, i);
            list.AddLast(a);
        }

        decimal sum = 0;
        foreach (var item in list)
            sum += item.A;

List (2.4 seconds)

        List<Temp> list = new List<Temp>(); // 2.4 seconds

        for (var i = 0; i < 12345678; i++)
        {
            var a = new Temp(i, i, i, i);
            list.Add(a);
        }

        decimal sum = 0;
        foreach (var item in list)
            sum += item.A;

Even if you only access data essentially it is much slower!! I say never use a linkedList.




Here is another comparison performing a lot of inserts (we plan on inserting an item at the middle of the list)

Linked List (51 seconds)

        LinkedList<Temp> list = new LinkedList<Temp>();

        for (var i = 0; i < 123456; i++)
        {
            var a = new Temp(i, i, i, i);

            list.AddLast(a);
            var curNode = list.First;

            for (var k = 0; k < i/2; k++) // In order to insert a node at the middle of the list we need to find it
                curNode = curNode.Next;

            list.AddAfter(curNode, a); // Insert it after
        }

        decimal sum = 0;
        foreach (var item in list)
            sum += item.A;

List (7.26 seconds)

        List<Temp> list = new List<Temp>();

        for (var i = 0; i < 123456; i++)
        {
            var a = new Temp(i, i, i, i);

            list.Insert(i / 2, a);
        }

        decimal sum = 0;
        foreach (var item in list)
            sum += item.A;

Linked List having reference of location where to insert (.04 seconds)

        list.AddLast(new Temp(1,1,1,1));
        var referenceNode = list.First;

        for (var i = 0; i < 123456; i++)
        {
            var a = new Temp(i, i, i, i);

            list.AddLast(a);
            list.AddBefore(referenceNode, a);
        }

        decimal sum = 0;
        foreach (var item in list)
            sum += item.A;

So only if you plan on inserting several items and you also somewhere have the reference of where you plan to insert the item then use a linked list. Just because you have to insert a lot of items it does not make it faster because searching the location where you will like to insert it takes time.

这篇关于什么时候应该使用一个列表VS在LinkedList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆