将列表拆分为N个子列表,大小平衡为C#
我需要在N个大小平衡的子列表中拆分列表。 例如,我有一个包含101个元素的列表,每个子列表中允许的最大元素数是100。 结果应该是两个子列表,一个包含50个元素,一个包含51个元素。 实际上,我的代码并不是在所有情况下都能正常工作将列表拆分为N个子列表,大小平衡为C#,c#,.net-core,C#,.net Core,我需要在N个大小平衡的子列表中拆分列表。 例如,我有一个包含101个元素的列表,每个子列表中允许的最大元素数是100。 结果应该是两个子列表,一个包含50个元素,一个包含51个元素。 实际上,我的代码并不是在所有情况下都能正常工作 public static void Split() { List<int> players = new List<int>(); var totalPlayers = 133;
public static void Split()
{
List<int> players = new List<int>();
var totalPlayers = 133;
for (int i = 0; i < totalPlayers; i++)
{
players.Add(i);
}
var maxSizeSubList = 100;
var number = (double)players.Count / maxSizeSubList;
var numberGroupsRound = Math.Ceiling(number);
var playersXGroup = (int) Math.Round(players.Count / numberGroupsRound);
var subLists = SplitList<int>(players, playersXGroup);
}
private static List<List<T>> SplitList<T>(List<T> locations, int nSize = 30)
{
var list = new List<List<T>>();
for (int i = 0; i < locations.Count; i += nSize)
{
list.Add(locations.GetRange(i, Math.Min(nSize, locations.Count - i)));
}
return list;
}
publicstaticvoidsplit()
{
列表玩家=新列表();
var=133;
对于(int i=0;i
在这个例子中,我得到了3个子列表,分别是,66,66和1
它的点核3.1,谢谢。您的是四舍五入,而不是向上:
var playersXGroup = (int)Math.Round(players.Count / numberGroupsRound);
应该是
var playersXGroup = (int)Math.Ceiling(players.Count / numberGroupsRound);
这回答了你的问题吗?我认为问题在于,在计算playersXGroup时,您使用的是Math.Round。你应该把它改为Math.天花,以确保它总是四舍五入。你的算法也可能有问题。例如,如果我有21个项目,并将6作为大小传递给第二个方法(因为您希望返回四个列表),那么您将得到三个大小为6的列表和一个大小为3的列表,其中一个不太平衡。如果你想这样做的话,我建议你增加列表的数量。然后可以将基本大小作为
var baseSize=totalItemCount/numberList代码>(使用整数数学进行取整。然后执行var biggerListCount=totalItemCount baseSize*numerists
,这是您的列表中需要一个额外项目才能覆盖整个集合的数量。