将数据添加到集合中,哪个更有效?

时间:2016-07-09 10:20:35

标签: c#

我正在向集合添加数据,但我不知道哪个更有效。

使用foreach循环,

internal class CollectionClass
{
    public List<string> ListData { get; set; }

    public CollectionClass()
    {
        ListData = new List<string>();
        string[] names = { "Matt", "Joanne", "Robert" };
        foreach (var item in names)
        {
            ListData.Add(item);
        }
    }
}

或者这更有效率?

internal class CollectionClass
{
    public List<string> ListData { get; set; }

    public CollectionClass()
    {           
        ListData.Add("Matt");
        ListData.Add("Joanne");
        ListData.Add("Robert");
    }
 }

所有逻辑都暗示后者,但是大数据就是这种情况吗?

1 个答案:

答案 0 :(得分:3)

除非您添加数百万条目,否则没有太大区别,因此请选择您更熟悉的代码。

以下是4种不同方式的基准。

1)带循环的数组(如第一种方法)。

2)带有AddRange的数组。几乎相同,但代码更好一点。

3)使用Add(如第二种方法)。

4)使用列表初始化器。

遗憾的是,我无法运行每次测试10,000次以上,因为dotnetfiddle.net会出现内存错误,但您可以复制代码并在计算机上尝试使用更高的数字(如100,000)。无论如何,结果是1和2几乎相同并且比3和4更快,这非常接近。但是你可以清楚地看到,即使在插入3个项目的10,000次时差异也很小。所以它真的可以忽略不计。

Link to fiddle demo

测试结果(以毫秒为单位):

  

测试1:6

     

测试2:6

     

测试3:2

     

测试4:2

测试代码:

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var c = new CollectionClass();
        var watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test1();
        watch.Stop();
        Console.WriteLine("Test1:" + watch.ElapsedMilliseconds);

        watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test2();
        watch.Stop();
        Console.WriteLine("Test2:" + watch.ElapsedMilliseconds);

        watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test3();
        watch.Stop();
        Console.WriteLine("Test3:" + watch.ElapsedMilliseconds);

        watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test4();
        watch.Stop();
        Console.WriteLine("Test4:" + watch.ElapsedMilliseconds);
    }
}

internal class CollectionClass
{
    public List<string> ListData { get; set; }

    public void Test1()
    {
        ListData = new List<string>();
        string[] names = { "Matt", "Joanne", "Robert" };

        foreach (var item in names)
            ListData.Add(item);
    }

    public void Test2()
    {
        string[] names = { "Matt", "Joanne", "Robert" };
        ListData = new List<string>();
        ListData.AddRange(names);
    }

    public void Test3()
    {
        ListData = new List<string>();
        ListData.Add("Matt");
        ListData.Add("Joanne");
        ListData.Add("Robert");
    }

    public void Test4()
    {
        ListData = new List<string>(){ "Matt", "Joanne", "Robert" };
    }
}