工作中遇到这么一个场景:
从Excel有中读取了大量数据,然后根据数据转为对象实体
(实体属性类型为double?,将单元格内容赋给实体属性)
问题是:在Excel中有大量的正确可转double的数据,但也有小量单元格的内容为空、空格、文本字符等。
多线程运行过程中发现有空白单元格时转换为实体特别慢;下面用了三种方法测试效率:
第一种,先判断单元格的object数据(单元格里提取到C#数组里的格式都是object)是否为空,然后再转String,再转double
第二种,先将object数据转为String,再转double
第三种,不拆箱,直接将object数据转为double测试结果
当 源数据中错误率为2/20时,即(26行代码:else if (i % 20 == 1|| i % 20 == 2))
当 源数据中错误率为1/20时,即(else if (i % 20 == 1))
测试结论:
第二种最慢(慢好多,不是差一点),一三相差不大求助:
即使是一三,效率也太慢了,我现在一个object[45,108]转成一个实体,要需要3分钟时间,
请高手帮忙指点下。测试代码:namespace WindowsFormsApp10
{
    public class A
    {
        public Double? a;
    }
    public partial class Form1 : Form
    {
        System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
        public Form1()
        {
            InitializeComponent();
        }        private void button2_Click(object sender, EventArgs e)
        {
            List<object> oa = new List<object>();
            List<A> TestA = new List<A>();
            List<A> TestB = new List<A>();
            List<A> TestC = new List<A>();            for (int i = 0; i < 9999; i++)
            {
                if (i % 20 == 0)
                { oa.Add(null); }
                else if (i % 20 == 1)
                {
                    oa.Add("杂");
                    //oa.Add(i);
                }
                else
                { oa.Add(i); }
            }            stopwatch.Start();
            for (int i = 0; i < 9999; i++)
            {
                if (oa[i] == null) continue;
                string ss = oa[i].ToString();
                try
                {
                    TestA.Add(new A() { a = Convert.ToDouble(ss) });
                }
                catch
                {
                    TestA.Add(new A() { a = null });
                }            }
            stopwatch.Stop();
            Console.WriteLine("一、先判断再用ToString拆箱,费时" + stopwatch.Elapsed.TotalSeconds);            stopwatch.Reset();
            stopwatch.Start();
            for (int i = 0; i < 9999; i++)
            {
                string ss = Convert.ToString(oa[i]);
                try
                {
                    TestB.Add(new A() { a = Convert.ToDouble(ss) });
                }
                catch
                {
                    TestB.Add(new A() { a = null });
                }            }
            stopwatch.Stop();
            Console.WriteLine("二、不判断直接用Convert.ToString拆箱,费时" + stopwatch.Elapsed.TotalSeconds);            stopwatch.Reset();
            stopwatch.Start();
            for (int i = 0; i < 9999; i++)
            {
                try
                {
                    TestC.Add(new A() { a = Convert.ToDouble(oa[i]) });
                }
                catch
                {
                    TestC.Add(new A() { a = null });
                }
            }
            stopwatch.Stop();
            Console.WriteLine("三、不拆箱,强制转,费时" + stopwatch.Elapsed.TotalSeconds);
            stopwatch.Reset();
            stopwatch.Start();
            stopwatch.Stop();
            Console.WriteLine(stopwatch.Elapsed.TotalSeconds);            Console.ReadLine();
        }
    }
}