1

我是 linq 和 c# 的新手。在这里我面临一个问题,我必须建模类

public class Product
{
    public int ItemID { get; private set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime AuctionEndDate { get; set; }
    public int Price { get; set; }
}

public class ShoppingCart
{
    public List<Product> Products { get; set; }
}

在这里,我想创建一个扩展方法,对我的购物车中的所有商品进行排序。

public static ShoppingCart Sort(this ShoppingCart cart)
{

    var sortedCart = from item in cart.Products
                     orderby item.Title ascending
                     select item;
    return sortedCart.ToList();
}

所以该方法不允许我返回sortedCart.ToList(),因为它包含 List。我怎样才能退回购物车?如果有人知道请帮助我。谢谢

4

3 回答 3

6

创建一个新ShoppingCart实例并将其设置Products为您刚刚生成的排序列表:

return new ShoppingCart { Products = sortedCart.ToList() };

当然这样原来的购物车不会被排序;它将是新的(重复的)购物车。如果您想对原始产品进行就地排序,您应该List<T>.Sort在原始产品集合上使用,而不是 LINQ:

cart.Products.Sort((x,y) => x.Title.CompareTo(y.Title));
于 2013-05-06T13:00:31.200 回答
1

您需要一种从产品列表创建购物车的方法。您可以使用现有的 setter 或构造函数:

public class ShoppingCart
{
    public ShoppingCart(List<Product> products)
    {
        this.Products = products;
    }
...
}

然后就return new ShoppingCart(sortedCart.ToList());

于 2013-05-06T13:01:58.587 回答
0

为什么需要扩展方法?

假设列表已经被填满。

shoppingCart.Products.OrderBy(x => x.Title);

或使用扩展方法

public static void Sort(this ShoppingCart cart)
{

    cart.Products = (from item in cart.Products
                     orderby item.Title ascending
                     select item).ToList();
}

或者

public static void Sort(this ShoppingCart cart)
{  
    shoppingCart.Products.OrderBy(x => x.Title);
}
于 2013-05-06T13:07:11.907 回答