如何将数组拆分为更小的数组?

时间:2017-09-22 14:48:46

标签: c#

我想获取一个名称列表,将它们添加到一个数组中,然后将该数组拆分为N个组,然后将这些数组显示在Windows窗体的单独文本框中。到目前为止,我已经拿到了这个列表并将它们分开,但说实话,我并不认为它正在做我想做的事情。

MasterList:

Johnny,Mark,Tom,Carl,Jenny,Susie,Ben,Tim,Angie

第1组:Johnny,Mark,Angie

第2组:汤姆,卡尔

第3组:珍妮,苏西

第4组:Ben,Tim

void addnamestoList_Click(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(this.studentnameTboxContent))
    {
        int num = (int)MessageBox.Show("No content to format.", 
                  "Message", 
                  MessageBoxButtons.OK, 
                  MessageBoxIcon.Exclamation);
    }
    else
    {
        transformText();
    }
}

public void transformText()
{
    string[] masterList = studentnameTboxContent.Split('\n');
    var split = from index in Enumerable.Range(0, masterList.Length)
        group masterList[index] by index / int.Parse(groupcountTboxContent);

    studentNames.Text = "";
    foreach (var Array in split)
    {
        studentNames.AppendText(string.Join(Environment.NewLine, Array.ToArray()));
    }
}

随机化列表的方法:

private string[] randomizeList(string[] list)
        {
            Random rnd = new Random();
            string[] randomList = list.OrderBy(x => rnd.Next()).ToArray();

            return randomList;
        }

1 个答案:

答案 0 :(得分:1)

这是一种方法,但它不是很优雅。基本上根据用户输入的组计数计算组大小,确定每组中应该有多少项,并确定需要添加到第一个列表中的剩余项目数(如果组不能均匀分配伯爵)。

然后,在一个循环中,跳过你到目前为止所用的项目数,然后取出组大小的项目数,如果还有额外的项目需要添加,请从结尾处抓取它们。列表:

var masterList = new List<string>
{
    "Johnny", "Mark", "Tom", "Carl",
    "Jenny", "Susie", "Ben", "Tim", "Angie"            
};

var groupCount = 4; // Entered by the user

var minGroupSize = masterList.Count / groupCount;
var extraItems = masterList.Count % groupCount;

var groupedNames = new List<List<string>>();

for (int i = 0; i < groupCount; i++)
{
    groupedNames.Add(masterList.Skip(i * minGroupSize).Take(minGroupSize).ToList());

    if (i < extraItems)
    {
        groupedNames[i].Add(masterList[masterList.Count - 1 - i]);
    }
}

Console.WriteLine("Here are the groups:");
for(int index = 0; index < groupedNames.Count; index++)
{
    Console.WriteLine($"#{index + 1}: {string.Join(", ", groupedNames[index])}");
}

Console.Write("\nDone!\nPress any key to exit...");
Console.ReadKey();

<强>输出

enter image description here

可以轻松地将此代码提取到方法中,以便可以在其他地方重复使用:

static List<List<string>> GetGroups(List<string> masterList, int groupCount)
{
    var groups = new List<List<string>>();

    // Argument validation. All of these conditions should be true.
    if (masterList != null && groupCount > 0 && groupCount <= masterList.Count)
    {
        var minGroupSize = masterList.Count / groupCount;
        var extraItems = masterList.Count % groupCount;

        for (int i = 0; i < groupCount; i++)
        {
            groups.Add(masterList.Skip(i * minGroupSize).Take(minGroupSize).ToList());

            if (i < extraItems)
            {
                groups[i].Add(masterList[masterList.Count - 1 - i]);
            }
        }
    }

    return groups;
}

<强>用法

var masterList = new List<string>
{
    "Johnny", "Mark", "Tom", "Carl", "Jenny",
    "Susie", "Ben", "Tim", "Angie"
};

var groupedNames = GetGroups(masterList, 4);