我正在尝试切割一个字符串列表(大小为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问题)。
答案 0 :(得分:0)
这个想法是使用modulo,它是listToDivide.Count
除numOfTiers
之后的剩余部分。如果该余数大于零,那么索引小于或等于该余数的所有层将具有一个或多个元素。因此,每个层的起始索引也必须得到纠正。请注意,我还没有写过任何支票(比如主列表中的元素数量是零,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。