我有一个Boxes
数组和一个Cats
数组。我需要将猫均匀地分配到盒子里
我目前的代码是:
Cat[] Cats = GetCats();
Box[] Boxes = GetBoxes();
int baseCatsPerBox = Cats.Length / Boxes.Length
int boxesWithOneExtraCat = Cats.Length % Boxes.Length
int boxIndex = 0;
foreach(Cat c in Cats)
{
Boxes[boxIndex].Cats.Add(c);
int catsInThisBox = baseCatsPerBox;
if (boxIndex < boxesWithOneExtraCat)
catsInThisBox++;
if (Boxes[boxIndex].Cats.Count == catsInThisBox)
boxIndex++;
}
此代码主要适用。如果我插入7
盒子和10
猫,我会得到:
2-2-2-1-1-1-1
我想要一种方法来做一个更均匀的分布(带有额外猫的盒子均匀分布),如下所示:
2-1-1-2-1-1-2
将一系列猫分配到一系列盒子中的最优雅(最少的代码行)方式是什么?
答案 0 :(得分:2)
试试这段代码:
int cats = 10;
int boxes = 7;
int[] result = new int[boxes];
double catsPerBox = (double)cats / boxes;
int index = 0;
double currentCats = 0;
int oldCats = 0;
while (index < boxes)
{
currentCats += catsPerBox;
int intCats = (int)Math.Round(currentCats - oldCats);
oldCats += intCats;
result[index++] = intCats;
}
它为cats = 10
数组中的boxes = 7
和result
生成以下&#34;偶数&#34; 分布:
1-2-1-2-1-2-1
答案 1 :(得分:0)
GroupBy
和Enumerable.Aggregate之后的{p> (int)(catIndex/floatPerBox
将为您提供一个语句选项:
// Note: float here to get floating number division
float catsPerBox = cats.Count()/(float)boxes.Count();
cats
.Select((value,index) => new {value, index})
.GroupBy(x=> (int)(x.index/catsPerBox), x=>x.value)
.Aggregate(
boxes,
(_,s)=> { boxes[s.Key]=s.ToArray(); return boxes; }
);