C#:比较具有相同属性的不同对象集

时间:2016-09-30 17:13:48

标签: c# linq

我有一个问题,我不确定最好的解决方法。我的解决方案"导致非常复杂的代码。

示例:我的数据模型有沙发和苹果。 Sofa类和Apple类都具有IsFavorite属性和FavoriteChange日期。我有一个像我这样使用的服务:

 List<Apple> top25FavApples = _appleService.FindFavorites(25);
 List<Sofa> top25FavSofas = _sofaService.FindFavorites(25);

现在我的苹果和沙发都被收藏了,我需要聚集这些集合,按照FavoriteChangeDate排序,然后限制在前25位。这就是我被困住的地方。

可能的解决方案:创建一个中间类来保存Apple / Sofa和FavoriteDate。对中间对象的集合执行选择,然后运行另一个查询以自行获取苹果和沙发。

2 个答案:

答案 0 :(得分:2)

最好的解决方案是创建一个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; }
    //...
}

答案 1 :(得分:0)

如果你不能添加一些接口或基类(这会更好),一个选项就是以动态方式转换为动态和查询,例如:

top25FavApples.Cast<dynamic>()
    .Concat(top25Sofas.Cast<dynamic>())
    .OrderBy(x => (DateTime)x.FavoriteChangeDate).Take(25)