首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何按规则拆分数组块?

如何按规则拆分数组块?
EN

Stack Overflow用户
提问于 2019-07-24 22:25:24
回答 1查看 104关注 0票数 1

我可以将数组分成更小的块。

代码语言:javascript
运行
复制
public class Item{
    public string Name {get; set;}  
    public bool IsUnique {get;set;} 
}

public static void Main()
{
    Random r = new Random();

    var source = new[] { 
        new Item { Name = "Item-1", IsUnique = true},
        new Item { Name = "Item-2", IsUnique = true},
        new Item { Name = "Item-3", IsUnique = true},
        new Item { Name = "Item-4"},
        new Item { Name = "Item-5"},
        new Item { Name = "Item-6"},
        new Item { Name = "Item-7"},
        new Item { Name = "Item-8"},
        new Item { Name = "Item-9"} 
    };

    var chunkSize = 3;

    var result = source         
        .OrderBy(a => r.Next())
        .Select((x, i) => new { Index = i, Item = x })          
        .GroupBy(s => s.Index / chunkSize)
        .Select(g => g.ToList())
        .ToList();

    foreach(var item in result)
    {
        Console.WriteLine("Chunk: "+ (result.IndexOf(item)+1));
        Console.WriteLine("-----------------------------------");
        foreach(var x in item)
        {               
            Console.WriteLine(x.Item.Name);
        }
        Console.WriteLine();
    }
}

结果如下所示:

代码语言:javascript
运行
复制
Chunk: 1
-----------------------------------
Item-2
Item-3
Item-8

Chunk: 2
-----------------------------------
Item-5
Item-9
Item-7

Chunk: 3
-----------------------------------
Item-6
Item-4
Item-1

但如果项的IsUniquer属性为true,则它们不能在同一块中。例如,上面的示例中,Chunk-1包含item-2item-3

我能用linq做到这一点吗?

更新:

如果块大小为3,则只有3个项目可以为IsUnique=true。

EN

回答 1

Stack Overflow用户

发布于 2019-07-24 22:58:08

将您的source数组分成两组:唯一项和rest项。然后遍历unique集合中的每个元素,并从nonUnique集合中获取chunkSize - 1。看看这段代码:

代码语言:javascript
运行
复制
var unique = source.Where(x => x.IsUnique);
var nonUnique = source.Where(x => !x.IsUnique)
    .OrderBy(x => r.Next())
    .ToList();

var result = unique.Aggregate(
    (list: new List<List<Item>>(), items: nonUnique),
    (c, n) =>
    {
        var next = c.items.Take(chunkSize - 1).ToList();
        next.Add(n);

        c.items.RemoveRange(0, chunkSize - 1);
        c.list.Add(next.OrderBy(x => r.Next()).ToList());
        return (c.list, c.items);
    }).list;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57185250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档