在C#中对IEnumerable<TShirts>进行限制与筛选的实现方法
实现IEnumerable的红蓝T恤筛选需求
完全可行,核心思路是分别筛选红、蓝T恤并取指定数量,再合并结果。以下是具体实现:
基础实现代码
替换你代码中的// What to do ?部分:
// 筛选红色T恤并取指定数量(250件) var redShirts = tshirtResults.Where(t => t.IsRed).Take(numberToTakeofeachcolor); // 筛选蓝色T恤并取指定数量(250件) var blueShirts = tshirtResults.Where(t => t.IsBlue).Take(numberToTakeofeachcolor); // 合并两个颜色的T恤集合,重新赋值给原变量 tshirtResults = redShirts.Concat(blueShirts);
逻辑说明
Where(t => t.IsRed):从原集合中过滤出所有红色T恤Take(numberToTakeofeachcolor):从筛选后的红色T恤中取前250件Concat:将红色和蓝色的T恤集合合并为一个新的IEnumerable<TShirts>- 最终
tshirtResults将包含最多500件T恤(250红+250蓝)
优化与边界处理
避免多次枚举原集合:
由于IEnumerable是延迟执行的,多次调用Where会重复枚举原4000件T恤,影响性能。可以先转成List优化:var tshirtList = tshirtResults.ToList(); var redShirts = tshirtList.Where(t => t.IsRed).Take(numberToTakeofeachcolor); var blueShirts = tshirtList.Where(t => t.IsBlue).Take(numberToTakeofeachcolor); tshirtResults = redShirts.Concat(blueShirts);处理颜色数量不足的情况:
如果原集合中红色/蓝色T恤数量不足250,上面的代码会取现有全部对应颜色的T恤,最终总数量会少于500。如果需要保证总数量为500,可以调整逻辑(比如优先取够一种颜色,剩下的从另一种补):var tshirtList = tshirtResults.ToList(); var redShirts = tshirtList.Where(t => t.IsRed).Take(numberToTakeofeachcolor).ToList(); int remaining = Limit - redShirts.Count; var blueShirts = tshirtList.Where(t => t.IsBlue).Take(remaining); tshirtResults = redShirts.Concat(blueShirts);
内容的提问来源于stack exchange,提问作者Jason Livengood
相关产品推荐
相关产品推荐

