gpt4 book ai didi

c# - 我如何连接两个具有相同基类的不同列表

转载 作者:太空狗 更新时间:2023-10-30 00:54:20 26 4
gpt4 key购买 nike

我有一个类叫做 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;
}

如您所见,它存储了一个对象的两个副本(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);
}

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

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

有什么办法吗?

最佳答案

我建议将基类添加到 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());
}
}
}

关于c# - 我如何连接两个具有相同基类的不同列表<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com