我如何连接两个具有相同基类的不同 list<T> ?

leo*_*ora 5 c# generics collections

我有一个类ItemChange<T>,看起来像这样:

public class ItemChange<T> where T : MyBase
{
    public DateTime When { get; set; }
    public string Who { get; set; }
    public T NewState;
    public T OldState;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它存储了一个对象的两个副本(NewStateOldState)。我用它来比较字段变化。

我现在正在尝试让它工作,我获得跨多个对象的更改列表,然后将几种不同类型的 T 列表连接到一个数组中,如下所示(注意:两者Object1Object2源自MyBase

public IEnumerable<ItemChange<T>> GetChangeHistory<T>(int numberOfChanges) where T : MyBase
{
    IEnumerable<ItemChange<Object1>> obj1Changes= GetChanges<Object1>();
    IEnumerable<ItemChange<Object2>> obj1Changes= GetChanges<Object2>();
    return obj1Changes.Concat(obj2Changes).OrderByDescending(r => r.When).Take(numberofChanges);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要连接多种类型的更改,但随后我想获取最新数量的更改(由 定义numberOfChanges

关于如何让下面的代码工作的任何建议,因为 Concat 行都会给我一个编译器错误(我假设我必须以某种特殊的方式进行转换才能使其工作)。

有什么办法可以做到这一点吗?

小智 4

我建议添加一个基类ItemChange<T>名为ItemChange. 可以ItemChange声明 When 属性。然后,将列表内容转换为基础ItemChange以进行连接和排序就变得非常容易。

using System;
using System.Collections.Generic;
using System.Linq;

namespace brosell
{

public class MyBase
{

}

public class ItemChange
{
    public DateTime When { get; set; }

}

public class ItemChange<T>: ItemChange where T : MyBase
{
    public string Who { get; set; }
    public T NewState;
    public T OldState;
}

public class Sub1: MyBase
{

}

public class Sub2: MyBase
{

}

   public class HelloWorld
   {
    public static void Main(string[] args)
    {
        List<ItemChange<Sub1>> listOfSub1 = new List<ItemChange<Sub1>>();
        List<ItemChange<Sub2>> listOfSub2 = new List<ItemChange<Sub2>>();

        var concated = listOfSub1.Cast<ItemChange>().Concat(listOfSub2.Cast<ItemChange>());

        var filtered = concated.OrderByDescending(ic => ic.When).Take(10);  

        Console.WriteLine("{0}", filtered.Count());
        }
   } 
}
Run Code Online (Sandbox Code Playgroud)