C# 按嵌套类属性排序

C# 按嵌套类属性排序,c#,linq,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; } pu

我的班级结构如下

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; }
    }
但我似乎对它的解决方案一无所知 请建议

谢谢

这更简单:

sorted_ProductDet_List = prdList.ProductDet
     .OrderBy(prDet => prDet.sortPrice)
     .ToList());
然后,您必须将属性
sortPrice
添加到priceDetail,该属性返回用作排序标准的相关价格


OrderBy
中的lambda作用于原始列表(List)的单个元素,并指定排序所基于的变量/属性/etc(可能来自任何嵌套类或方法)。

您可以使用自定义的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);
    }
}

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

我认为
priceClass
应该被称为
Product
。不是吗?顺便说一句,课程以大写字母开头。。。你们在课堂开始时在小型和大型之间切换。也许为了更好的代码可读性,我已经更新了代码,在结构上出现了一些问题,我希望这个问题现在还不清楚应该发生什么:按priceCl中的最高价格排序?最低的?一般?我们需要一个单一的值作为排序标准。你能澄清一下{1,5,6}的列表应该如何与{9,2}进行比较吗?@Md.Parvez-Alam:什么?我认为解决方案做得很好。
priceCl.price
是什么意思?(
priceCl
似乎是列表…)在您的问题的评论中添加了问题,并编辑了我的回答是的,但有一种产品有一个价格列表。这么多的价格怎么办?(见上文阿列克谢的评论)
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);
    }
}
// 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();