我可以将数组分成更小的块。
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。
发布于 2019-07-24 22:58:08
将您的source数组分成两组:唯一项和rest项。然后遍历unique集合中的每个元素,并从nonUnique集合中获取chunkSize - 1。看看这段代码:
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;https://stackoverflow.com/questions/57185250
复制相似问题