1. ホーム
  2. c#

[解決済み] リストとLinkedListの使い分けについて

2022-03-22 06:43:57

質問

を使用した方が良い場合は? リスト とは異なり LinkedList ?

解決方法は?

編集

<ブロッククオート

この回答へのコメントをお読みください。私が を行うことができます。これは回答として認められるべきでないことは同意します。私は 学習中にいくつかのテストを行ったので、それを共有したいと思いました。

オリジナルの答えは...

面白い結果が出ました。

// 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;
    }
}

リンクリスト(3.9秒)

        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;

リスト(2.4秒)

        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;

本来はデータにアクセスするだけでも、かなり遅くなる! リンクリストは絶対に使うなということです。




以下は、多くの挿入を行う別の比較です(リストの中央にアイテムを挿入する予定です)。

リンクリスト(51秒)

        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;

リスト(7.26秒)

        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;

挿入する場所の参照を持つリンクリスト(0.04秒)

        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;

そのため、複数のアイテムを挿入する予定がある場合に限り、あなたが また 挿入する場所のリファレンスがある場合は、リンクリストを使用します。なぜなら、挿入したい場所を探すのに時間がかかるからです。