如何按X数量交替分组有图片与无图片的列表项?
C# 按指定数量交替分组有图/无图列表项
原始数据
我们有如下C#列表:
var items = new List<Item>() { new Item { Image = "/path1", Title = "Title1" }, new Item { Image = "", Title = "Title2" }, new Item { Image = "/path2", Title = "Title3" }, new Item { Image = "/path3", Title = "Title4" }, new Item { Image = "/path4", Title = "Title5" }, new Item { Image = "", Title = "Title6" } }; public class Item { public string Image { get; set; } public string Title { get; set; } }
需求
按指定数量X(示例中为3)交替循环分组:先取X个有图片的项(Image不为空),接着取X个无图片的项(Image为空),再取X个有图片的项,以此类推,直到所有项被处理完毕。
示例预期输出(按X=3分组):
{ hasImage, [Item { Image = "/path1", Title = "Title1" }, Item { Image = "/path2", Title = "Title3" }, Item { Image = "/path3", Title = "Title4" }] }, { !hasImage, [Item { Image = "", Title = "Title2" }, Item { Image = "", Title = "Title6" }] }, { hasImage, [Item { Image = "/path4", Title = "Title5" }] }
实现方案
核心思路是先把列表拆分为有图项队列和无图项队列,然后交替从两个队列中按指定数量提取元素,直到两个队列都为空。
代码实现
using System; using System.Collections.Generic; using System.Linq; public class Item { public string Image { get; set; } public string Title { get; set; } public override string ToString() { return $"Item {{ Image = \"{Image}\", Title = \"{Title}\" }}"; } } class Program { static void Main() { var items = new List<Item>() { new Item { Image = "/path1", Title = "Title1" }, new Item { Image = "", Title = "Title2" }, new Item { Image = "/path2", Title = "Title3" }, new Item { Image = "/path3", Title = "Title4" }, new Item { Image = "/path4", Title = "Title5" }, new Item { Image = "", Title = "Title6" } }; int groupSize = 3; var groupedResult = AlternateGroupItems(items, groupSize); // 打印结果 foreach (var group in groupedResult) { var itemsStr = string.Join(", ", group.Items.Select(i => i.ToString())); Console.WriteLine($"{{ {(group.HasImage ? "hasImage" : "!hasImage")}, [{itemsStr}] }}"); } } static IEnumerable<GroupedItem> AlternateGroupItems(List<Item> items, int groupSize) { // 拆分到两个队列 var hasImageQueue = new Queue<Item>(items.Where(i => !string.IsNullOrEmpty(i.Image))); var noImageQueue = new Queue<Item>(items.Where(i => string.IsNullOrEmpty(i.Image))); bool takeHasImageNext = true; // 先取有图项 while (hasImageQueue.Count > 0 || noImageQueue.Count > 0) { if (takeHasImageNext && hasImageQueue.Count > 0) { // 取最多groupSize个有图项 var group = new List<Item>(); for (int i = 0; i < groupSize && hasImageQueue.Count > 0; i++) { group.Add(hasImageQueue.Dequeue()); } yield return new GroupedItem { HasImage = true, Items = group }; } else if (!takeHasImageNext && noImageQueue.Count > 0) { // 取最多groupSize个无图项 var group = new List<Item>(); for (int i = 0; i < groupSize && noImageQueue.Count > 0; i++) { group.Add(noImageQueue.Dequeue()); } yield return new GroupedItem { HasImage = false, Items = group }; } // 切换分组类型 takeHasImageNext = !takeHasImageNext; } } // 用于存储分组结果的类 public class GroupedItem { public bool HasImage { get; set; } public List<Item> Items { get; set; } } }
输出结果
运行上述代码后,输出与预期一致:
{ hasImage, [Item { Image = "/path1", Title = "Title1" }, Item { Image = "/path2", Title = "Title3" }, Item { Image = "/path3", Title = "Title4" }] }, { !hasImage, [Item { Image = "", Title = "Title2" }, Item { Image = "", Title = "Title6" }] }, { hasImage, [Item { Image = "/path4", Title = "Title5" }] }
内容的提问来源于stack exchange,提问作者Vardan
相关产品推荐
相关产品推荐

