c# - 如何按规则拆分数组块?
问题描述
我可以将数组拆分成更小的块。
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();
}
}
结果是这样的:
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-2
和item-3
。
我可以使用 linq 做到这一点吗?
更新:
如果块大小为 3,则只有 3 个项目可能是 IsUnique=true。
解决方案
将你的source
数组分成两组:那些是唯一的和休息的。然后遍历集合中的每个元素unique
并chunkSize - 1
从nonUnique
集合中获取。看一下这段代码:
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;
推荐阅读
- logstash - Logstash TLS 握手失败
- swift - 结合 SwiftUI 在 Swift5 中存储数据的最常见方式
- autodesk-forge - 如何实现“Autodesk.AEC.LevelsExtension”和“Autodesk.AEC.Minimap3DExtension”
- javascript - 如何在d3中创建一条线?
- python - 在 HED 算法中检测大颗粒旁边的小颗粒的替代方法
- visual-studio-code - 无法在 RHEL8 上以 root 身份运行 Visual Studio 代码
- asp.net - 在 Google Colab 上安装 .NET Core
- react-native - 无法在 React Native 0.61.5 新项目上安装 pod
- haskell - 使用最近的集合重复从 Postgres 获取值
- javascript - findByIdAndUpdate 不更新