使用LINQ无法基于另一个列表对Variant列表排序
问题原因
你写的OrderBy逻辑里,MaterialOrderdetails.Where(b => b.ItemNo == a.ItemNo)返回的是匹配当前Variant的MaterialOrder集合,而集合类型没有实现IComparable接口,OrderBy无法基于集合进行排序,所以抛出这个错误。
解决方案
第一步:把MaterialOrder转成字典提升查找效率
因为要频繁根据ItemNo找对应的排序号,用字典可以把查找复杂度从O(n)降到O(1),避免500+条Variant每条都遍历100条MaterialOrder:
// 把MaterialOrder转成ItemNo为键、Orderno为值的字典 var orderDict = MaterialOrderdetails.ToDictionary(mo => mo.ItemNo, mo => mo.Orderno);
第二步:基于字典的排序值进行排序
用TryGetValue处理两种情况:在MaterialOrder里存在的Variant用对应的Orderno排序,不存在的给一个默认值(比如int.MaxValue让它们排到最后,或者0排最前面,根据你的需求调整):
variants = variants.OrderBy(a => orderDict.TryGetValue(a.ItemNo, out var order) ? order : int.MaxValue ).ToList();
补充说明
如果确定每个Variant的ItemNo都能在MaterialOrder里找到(不会有不存在的情况),也可以直接用orderDict[a.ItemNo],但用TryGetValue更安全,避免出现KeyNotFoundException。
内容的提问来源于stack exchange,提问作者user2432361
相关产品推荐
相关产品推荐

