将List <basetype>转换为List <derivedtype>并考虑到性能

时间:2017-05-24 09:02:13

标签: c# inheritance generic-list

我有一个非常密集的例程,我是客户,向我返回List<BaseType>。除其他参数外,该例程还包含DateTime,但返回的List<BaseType>并未包含此信息:BaseType没有DateTime成员可以跟踪此信息。 (这是因为例程设计为仅在一个日期调用,在VBA中完成许多日期的循环。)

现在我需要有这个额外的日期信息,因为我想在一个List<BaseType>中连接许多不同的List<BaseType>(由不同的日期生成),我想要应用一些需要约会的处理 - 察觉。

因此,我实施了一个直接的DerivedType课程BaseType,并将此日期时间纳入其他信息。

我想知道什么是最佳(在性能方面,理想情况下没有副本)方式来转换&#34; List<BaseType>List<DerivedType>DerivedType所有DateTime成员的价值相同。

备注。我想同时将所有生成的List<DerivedType>&#39}放在一个List<DerivedType>中,我将不得不使用List进行修剪的运作。这就是我为什么要坚持List&#39>。

澄清编辑

上下文:在VBA中,我遍历了许多日期,对于每个日期,由于c# dll,我生成了一个数组,最后,我在某处打印(在VBA中)所有这些数组。在c#中生成一个数组使用上述例程(我不能因为它依赖于遗留dll而改变):List<BaseType>生成日期,并以日期相关的方式处理以生成数组。我想要做的是从VBA中删除日期循环并在c#中执行。作为&#34;治疗&#34;实际上取决于List<BaseType>的列表性质,并且在日期,BaseType会合并日期信息,我可以将所有List<BaseType>连接到唯一的List<BaseType>我将应用治疗,而不是按列表列出。但是BaseType没有包含日期​​信息,所以我被卡住......这导致了这个问题。

1 个答案:

答案 0 :(得分:0)

这是一种没有铸造的替代品。你仍然需要处理列表清单......

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{

    public class BaseClass
    {
    }

    public class BaseClassList : List<BaseClass>
    {
        public DateTime CallDate { get; set; }

        public BaseClassList(IEnumerable<BaseClass> elements, DateTime CallDate)
            : base(elements)
        {
            this.CallDate = CallDate;
        }
    }

    public static class BaseClassExtensions
    {
        public static DateTime Date(this BaseClass ext, BaseClassList bcl)
        {
            return bcl.CallDate;
        }
    }

    class Program
    {
        public static List<BaseClass> Func(DateTime d)
        {
            BaseClass A = new BaseClass();
            BaseClass B = new BaseClass();
            return new List<BaseClass>() { A, B };
        }

        static void Main(string[] args)
        {
            DateTime d1 = new DateTime(2017, 5, 1);
            DateTime d2 = new DateTime(2018, 5, 1);
            List<DateTime> dates = new List<DateTime>() { d1, d2 };


            List<BaseClassList> myList = new List<BaseClassList>();

            foreach (DateTime d in dates)
                myList.Add(new BaseClassList(Func(d), d));

            foreach(var el in myList)
                foreach (BaseClass bc in el)
                    Console.WriteLine(bc.Date(el));
        }
    }
}