按嵌套类属性排序

时间:2015-01-28 06:26:37

标签: c# linq

我有以下课程结构

public class PriceClass
    {  
        public int id { get; set; }
        public string price { get; set; }
        public int product_id { get; set; }

    }

    public class NameClass
    {
        public int id { get; set; }
        public string name { get; set; }

    }

    public class ProductDetails
    {
        public int id { get; set; }
        public string product_type { get; set; }
         public List<NameClass> nameCl{ get; set; }
        public List<PriceClass> priceCl{ get; set; }
    }

    public class ProductLists
    {
        public List<ProductDetails> ProductDet{ get; set; }
    }

现在我想用价格对ProductLists进行排序,即在priceClass类

我尝试了一些解决方案,但这似乎不起作用

prdList = (ProductLists )prdList.ProductDet.OrderBy(r => r.priceCl.OrderBy(x => x.price).ToList());

但似乎我无法解决它的问题 请建议

由于

2 个答案:

答案 0 :(得分:2)

这更简单:

sorted_ProductDet_List = prdList.ProductDet
     .OrderBy(prDet => prDet.sortPrice)
     .ToList());

然后您必须向priceDetail添加一个Property sortPrice,它返回用作sort sorterium的相关价格。

OrderBy内的lambda处理原始List(List)的单个元素,并指定排序所基于的变量/ property / etc(可能来自任何嵌套的类或方法)。

答案 1 :(得分:0)

您可以使用自定义IComparer来比较产品详细信息。

public class ProductDetailsComparer : IComparer<ProductDetails>
{
    private bool _compareMinPrice;

    public ProductDetailsComparer(bool compareMinPrice)
    {
        _compareMinPrice = compareMinPrice;
    }

    public int Compare(ProductDetails x, ProductDetails y)
    {
        var left = _compareMinPrice ? x.priceCl.Min(p => p.price) : x.priceCl.Max(p => p.price);
        var right = _compareMinPrice ? y.priceCl.Min(p => p.price) : y.priceCl.Max(p => p.price);

        return left.CompareTo(right);
    }
}

您可以在OrderBy中使用自定义比较器,如下所示。

// Sort by minimum price
        var ascending = productLists.ProductDet.OrderBy(x => x, new ProductDetailsComparer(true)).ToList();
        // Sort by maximum price
        var descending = productLists.ProductDet.OrderBy(x => x, new ProductDetailsComparer(false)).ToList();

以上只是一个例子。您可以编写适合您要求的自定义比较器。