Linq相关问题:按对象类型排序列表及分组后CS1503类型转换错误
问题解答
问题1:如何使用Linq按对象类型对List<>进行排序?
直接通过OrderBy结合对象的GetType()方法即可实现按类型排序,示例代码如下:
// 包含不同类型对象的列表 List<object> mixedObjects = new List<object> { new int(456), new string("Test"), new DateTime(2024, 5, 1), new string("Example"), new double(3.14) }; // 按类型名称升序排序 var sortedByName = mixedObjects.OrderBy(item => item.GetType().Name).ToList(); // 按Type本身排序(逻辑与按名称一致) var sortedByType = mixedObjects.OrderBy(item => item.GetType()).ToList();
若需要降序排序,替换为OrderByDescending即可。
问题2:解决CS1503类型转换错误及重复项分组问题
错误原因
GroupBy返回的是IGrouping<string, ShopItem>类型集合,但CartItem构造函数要求传入List<ShopItem>,类型不匹配导致转换失败。此外原代码存在冗余逻辑:
Where(item => item.Count() > 0)完全多余,分组后的每组至少包含一个元素CartItem构造函数内的GroupBy检查没必要,分组逻辑已保证同组元素Title一致
修复后的代码
public class ShopItemsSorter { public IEnumerable<CartItemView> SortFromShopItemsToCartItemView(List<ShopItem> shopItemsToSort) { List<CartItem> cartItems = new List<CartItem>(); // 直接按Title分组,移除多余的Where条件 var groupedItems = shopItemsToSort.GroupBy(item => item.Title); foreach (var itemGroup in groupedItems) { // 将IGrouping转换为List<ShopItem>传入构造函数 CartItem cartItem = new CartItem(itemGroup.ToList()); cartItems.Add(cartItem); } return cartItems; } } public class CartItem { public int Amount; public ShopItem ShopItem; public CartItem(List<ShopItem> shopitems) { ShopItem = shopitems[0]; Amount = shopitems.Count; // 移除冗余的分组检查,分组逻辑已保证同组Title一致 } }
简化优化(可选)
用Linq链式调用省略foreach循环,代码更简洁:
public IEnumerable<CartItemView> SortFromShopItemsToCartItemView(List<ShopItem> shopItemsToSort) { return shopItemsToSort .GroupBy(item => item.Title) .Select(group => new CartItem(group.ToList())) .ToList(); }
内容的提问来源于stack exchange,提问作者Ilona
相关产品推荐
相关产品推荐

