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();