将列表拆分为N个子列表,大小平衡为C#

将列表拆分为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;

我需要在N个大小平衡的子列表中拆分列表。 例如,我有一个包含101个元素的列表,每个子列表中允许的最大元素数是100。 结果应该是两个子列表,一个包含50个元素,一个包含51个元素。 实际上,我的代码并不是在所有情况下都能正常工作

    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
,这是您的列表中需要一个额外项目才能覆盖整个集合的数量。