C#:比较具有相同属性的不同对象集
问题描述:
我有一个问题,我不确定最佳解决方法。而我的“解决方案”正在导致非常复杂的代码。C#:比较具有相同属性的不同对象集
例如:我的数据模型有沙发和苹果。 Sofa类和Apple类都有一个IsFavorite属性和一个FavoriteChange日期。我有我使用像这样的一个服务:
List<Apple> top25FavApples = _appleService.FindFavorites(25);
List<Sofa> top25FavSofas = _sofaService.FindFavorites(25);
现在,我有我的苹果和沙发被收藏,我需要聚集的集合,排序FavoriteChangeDate,然后限制到前25名。这是我卡住了。
可能的解决方案:创建一个中介类来容纳Apple/Sofa和FavoriteDate。在中间对象的集合上执行选择,然后运行另一个查询以自行取回苹果和沙发。
答
最好的解决办法来创造一个IFavoriteable
接口,该接口定义FavoriteChangeDate
属性并让这两个类实现它。然后你可以投到IFavoriteable
并在其上做一个Linq OrderBy
。
class Program
{
static void Main()
{
List<Apple> top25FavApples = _appleService.FindFavorites(25);
List<Sofa> top25FavSofas = _sofaService.FindFavorites(25);
List<IFavoriteable> top25Total = top25FavApples.Concat<IFavoriteable>(top25FavSofas)
.OrderBy(x => x.FavoriteChangeDate)
.Take(25).ToList();
}
}
public interface IFavoriteable
{
DateTime? FavoriteChangeDate { get; }
}
public class Apple : IFavoriteable
{
public DateTime? FavoriteChangeDate { get; set; }
//...
}
public class Sofa : IFavoriteable
{
public DateTime? FavoriteChangeDate { get; set; }
//...
}
答
如果不能增加一些接口或基类(这将是更好的)一个选择是转换为动态的,查询在时尚动感,如:
top25FavApples.Cast<dynamic>()
.Concat(top25Sofas.Cast<dynamic>())
.OrderBy(x => (DateTime)x.FavoriteChangeDate).Take(25)
你可以让Apple和Sofa继承一个'IFavoratable'接口。 – Abion47