将List <string>划分为大小相等的子列表N </string>

时间:2014-11-13 13:23:16

标签: c# list

我正在尝试切割一个字符串列表(大小为N),并根据被切成相等部分(X)的列表返回一个范围。

例如,如果我有一个说10个元素的列表,并且我的层数是5。

元素0和1是第1层。元素2和3是第2层。在方法结束时,我返回参数中指定的层。

我正在努力的是,如果列表计数不能被层数整除。例如,23/5 = 4.6。这意味着它们将是5组4,然后剩下3组。我希望结果为5层5,5,5,5,3(最后一层只剩下剩余的元素数)。

到目前为止,我已经包含了我的代码,但我真的不知道如何确保列表大小尽可能相等以及如何处理余数。

// Gets a list and returns a range by the tier specified
public List<string> GetRangeByTierIndex(List<string> listToDivide, int numOfTiers, int tierIndexToGet)
{
    int numOfElementsPerList = listToDivide.Count / numOfTiers;

    int index = (tierToGet - 1) * numOfElementsPerList;

    return listToDivide.GetRange(index, numOfElementsPerList);
}

注意:忘记提及,我也不能使用LINQ(AOT和iOS问题)。

2 个答案:

答案 0 :(得分:0)

这个想法是使用modulo,它是listToDivide.CountnumOfTiers之后的剩余部分。如果该余数大于零,那么索引小于或等于该余数的所有层将具有一个或多个元素。因此,每个层的起始索引也必须得到纠正。请注意,我还没有写过任何支票(比如主列表中的元素数量是零,numOfTiers < tierIndexToGet等等......但是如果需要,可以添加这些支票)。另外,对于您的示例,这将为列表添加5, 5, 5, 4, 4元素而不是5, 5, 5, 5, 3,但我认为这更好。无论如何,我希望它能满足您的需求。代码应该类似于:

public List<string> GetRangeByTierIndex(List<string> listToDivide, int numOfTiers, int tierIndexToGet)
{
    int remaining = listToDivide.Count % numOfTiers;
    int numOfElementsPerList = listToDivide.Count / numOfTiers;
    int index = (tierIndexToGet - 1) * numOfElementsPerList;
    if (remaining > 0)
    {
        // most increase position of index because of numOfElementsPerList correction bellow
        index += tierIndexToGet > remaining ? remaining : tierIndexToGet - 1;
        // first 'remaining-th' tiers will have +1 element
        numOfElementsPerList += tierIndexToGet <= remaining ? 1 : 0;
    }
    return listToDivide.GetRange(index, numOfElementsPerList);
}

答案 1 :(得分:0)

示例:23和5。

  • 23/5 = 4 // 4层5 - 使用整数除法
  • 23%5 = 3 // 1层3