C# 分割给定字符串的元素

C# 分割给定字符串的元素,c#,list,C#,List,我应该将元素分成几个长度相等的小子字符串。子字符串的计数应等于给定的分区。如果字符串不能精确地划分到给定的分区中,我必须将除最后一个分区外的所有分区长度相等,并将最后一个分区设置为最长的分区 我试着做了第一部分,但不是所有情况下都有效。你能告诉我一个方法吗,但如果可能的话,比如for循环 例如: {abcd},3个分区->{a,b,cd};{qrstuvwxyz},5个分区->{qr st uv wx yz} private static List<string> Divide(Li

我应该将元素分成几个长度相等的小子字符串。子字符串的计数应等于给定的分区。如果字符串不能精确地划分到给定的分区中,我必须将除最后一个分区外的所有分区长度相等,并将最后一个分区设置为最长的分区

我试着做了第一部分,但不是所有情况下都有效。你能告诉我一个方法吗,但如果可能的话,比如for循环

例如: {abcd},3个分区->{a,b,cd};{qrstuvwxyz},5个分区->{qr st uv wx yz}

private static List<string> Divide(List<string> input, int index, int partitions)
{
        string stringToDivide = input[index];
        input.RemoveAt(index);
        string add = "";

        if (stringToDivide.Length % partitions == 0)
        {

            for (int i = 0; i < stringToDivide.Length; i++)
            {
                add += stringToDivide[i] + " ";
            }

            input.Insert(index, add.Trim());
        }
        else
        {

        }
        return input;
        Console.WriteLine(string.Join(' ', input));
}
私有静态列表划分(列表输入、int索引、int分区)
{
字符串stringToDivide=输入[索引];
输入。删除(索引);
字符串add=“”;
if(stringToDivide.Length%分区==0)
{
for(int i=0;i
stringToDivide.Length%partitions
是划分为
分区后剩余的字符数


stringToDivide.Length/partitions
是每个分区中应包含的字符数,最后一个分区应附加剩余字符

因此,只需获取第一个
分区
stringToDivide.Length/partitions
Length块,然后将剩余的内容追加到最后一个块中


当字符串可等分时,
stringToDivide.Length%partitions
为零,因此这不是特例。

您可以执行以下操作:

private static List<string> Divide(List<string> input, int index, int partitions)
{
    var stringToDivide = input[index];
    input.RemoveAt(index);

    var stringToAdd = "";
    var partitionLength = stringToDivide.Length / partitions;

    for (int i = 0, partitionNum = 0; i < stringToDivide.Length; i++)
    {
        if (i % partitionLength == 0 && partitionNum != partitions)  // skip space in last part
        {
            if (i > 0) // do not add leading space
            {
                stringToAdd += " ";
            }

            partitionNum++;
        }

        stringToAdd += stringToDivide[i];
    }

    input.Insert(index, stringToAdd);

    return input;
}
私有静态列表划分(列表输入、int索引、int分区)
{
var stringToDivide=输入[索引];
输入。删除(索引);
var stringToAdd=“”;
var partitionLength=stringToDivide.Length/partitions;
for(inti=0,partitionNum=0;i0)//不添加前导空格
{
stringToAdd+=“”;
}
partitionNum++;
}
stringToAdd+=stringToDivide[i];
}
输入.插入(索引,stringToAdd);
返回输入;
}
此代码为每个
分区长度添加空格,但为最后一个字符串跳过空格。请注意,对于长字符串,最好使用
StringBuilder

公共静态列表divideintospartitions(stringstringtodivide,int partitions)
 public static List<string> DivideIntoPartitions(string stringToDivide, int partitions)
        {
            var parts = new List<string>(partitions);
            var len = stringToDivide.Length;

            if (len < partitions)
            {
                throw new ArgumentException("partitions should be less than length");
            }

            if (len % partitions == 0)
            {
                var eachSubstrLength = len / partitions;

                for (int i = 0; i < stringToDivide.Length; i += eachSubstrLength)
                {
                    parts.Add(stringToDivide.Substring(i, eachSubstrLength));
                }
            }
            else
            {
                var nextDivisibleNumber = len + (partitions - (len % partitions));
                var lengthOfLastSubstr = nextDivisibleNumber / partitions;
                var lastItem = stringToDivide.Substring((len - lengthOfLastSubstr));
                stringToDivide = stringToDivide.Remove((len - lengthOfLastSubstr));

                var chunksize = stringToDivide.Length / (partitions - 1);

                for (int i = 0; i < stringToDivide.Length; i += chunksize)
                {
                    parts.Add(stringToDivide.Substring(i, chunksize));
                }
                parts.Add(lastItem);

            }
            return parts;

        }

 var result = DivideIntoPartitions("qrstuvwxyz", 3);
{ var部件=新列表(分区); var len=stringToDivide.Length; if(len<分区) { 抛出新ArgumentException(“分区应小于长度”); } if(len%partitions==0) { var eachSubstrLength=len/分区; for(int i=0;i
你能给出一些测试用例(预期的输入和输出)吗?@WaiHaLee,是的,我能。{abcd},3个分区->{a,b,cd};{qrstuvwxyz},5个分区->{qr-st-uv-wx-yz}一个合适的例子是
var-result=Divide(new List(){“foo”,“bar”},2,3);Console.WriteLine(string.Join(“,”,结果);
然后说出期望的输出字符串是什么。这是一个程序片段,我们可以实际运行,在调试器中查看,等等。这很清楚。再次,请帮助我们帮助您。不要让我们做工作来帮助您;您尽可能多的工作来帮助我们尽快获得解决方案。记住,您作为初学者的目标是程序员是学习如何编程的。让别人为你工作不会让你成为一名成功的程序员。组织你的工作、编写测试用例和清楚地描述问题是专业编程的重要组成部分,所以今天就练习一下这项技能。@EricLippert,我很感谢你向我解释所有这些事情。我将在我的下一篇文章中直接使用它们。你好,卡洛扬谢谢你!我感谢你的帮助!谢谢!我感谢你的帮助!