You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:25:22