C#将数字插入到列表框中的排序位置

时间:2018-11-09 12:19:05

标签: c# arrays sorting random listbox

请问我的nooby第一帖。我在大学分配方面遇到问题。分配是一个“号码列表管理器”,基本上用户选择一个单选按钮(已排序或未排序),当他们单击一个按钮时,将根据用户的选择将30个数字添加到列表框中。我没有未排序的代码的问题。讲师特别希望我们将排序后的数字添加到列表中并在添加时对其进行排序,而不是生成整个列表然后对其进行排序。

if (radUnsorted.Checked == true)//if unsorted
{
    RunChecks();
    do
    {
        numberToInput = (rnd.Next(0, 100));//sets number to input to random number
        int i = 1;

        while (i < lstNumbers.Items.Count)//loops though whole list
        {
            if (numberToInput == ConvertToInt32(lstNumbers.Items[i]))//checks that number doesnt already exist in list
            {
                numberToInput = (rnd.Next(0, 101));//genrate new random number
                i = 0;//set to 0 to restart checking through the list
            }
            else//if the number isnt at i index
            {
                i++;//move onto next number
            }
        }

        lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
        RunChecks();//check if the list is full

    } while (spaceLeft == true);//keep looping untill list is full
}

这是我的代码,用于将数字添加到列表中未排序的位置。我尝试过在线查找,但是我唯一能看到的方法是一个for循环,将数字添加到列表中,然后再使用另一个for循环对它们进行排序。

以下是条件的摘要: 您必须在插入和删除过程中使用自己的代码来操作列表,并且一定不能使用C#方法自动执行任务,例如插入未排序列表仅需要将新值放置在当前最后一个条目之后的下一个可用位置,而插入已排序列表则需要您的代码定位插入点并移动任何较高值的条目以打开/释放插入包含新值的点。

我不要求任何人为我做这项工作,但即使是伪代码也会很感激

3 个答案:

答案 0 :(得分:1)

好吧,首先,我不确定这些检查列表是否完整的内容,难道不是每次按下按钮并重复1到30时就清除项目吗?

无论如何,这是我为排序和未排序都删除的一些代码:

private void unsorted_Click(object sender, EventArgs e)
{
    lstNumbers.Items.Clear(); //clear any existing numbers, and add a new 30.
    var rand = new Random();
    for (var i = 0; i < 30; i++)
    {
        var randNumber = rand.Next(0, 100);
        while (lstNumbers.Items.Contains(randNumber))
        {
            //generate new number until it's unique to the list.
            randNumber = rand.Next(0, 100);
        }
        lstNumbers.Items.Add(randNumber);
    }
}

private void sorted_Click(object sender, EventArgs e)
{
    lstNumbers.Items.Clear(); //clear any existing numbers, and add a new 30.
    var rand = new Random();
    for (var i = 0; i < 30; i++)
    {
        var randNumber = rand.Next(0, 100);
        while (lstNumbers.Items.Contains(randNumber))
        {
            //generate new number until it's unique to the list.
            randNumber = rand.Next(0, 100);
        }

        if (lstNumbers.Items.Count == 0)
        {
            //we have no items, obviously the default position would be 0.
            lstNumbers.Items.Add(randNumber);
            continue; //next iteration
        }

        //find out the sorted position
        var bestPos = 0;
        for (var j = 0; j < lstNumbers.Items.Count; j++) //loop through the current list.
        {
            var currValue = Convert.ToInt32(lstNumbers.Items[j]);
            if (randNumber > currValue)
            {
                bestPos = j + 1;
            }
            else
            {
                bestPos = j;
                break; //we no longer need to check, it will never be any less than this.
            }
        }
        if (bestPos < 0)
            bestPos = 0;
        lstNumbers.Items.Insert(bestPos, randNumber);
    }
}

答案 1 :(得分:0)

您已经遍历了列表并读取了每个值,因此您所要做的就是检查现有值是否大于您要插入的值。如果是这样,则应将其插入刚刚检查的项目之前。

            var inserted = false;
            while (i < lstNumbers.Items.Count)//loops though whole list
            {
                if (numberToInput == Convert.ToInt32(lstNumbers.Items[i]))//checks that number doesnt already exist in list
                {
                    numberToInput = (rnd.Next(0, 101));//genrate new random number
                    i = 0;//set to 0 to restart checking through the list
                }
                else if (numberToInput < Convert.ToInt32(lstNumbers.Items[i])
                {
                    lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
                    inserted = true;
                } 
                else//if the number isnt at i index
                {
                    i++;//move onto next number
                }
            }

            if (!inserted)
            { 
                lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
            }

请注意新项目何时需要放在列表末尾的检查。

我想这就是您的老师想要的,理解如何使用数组很重要,但是在C#中对列表进行排序的最佳方法实际上不是使用数组,而是使用拥有自己的List或其他类排序方法。

        var myList = new List<int>();
        myList.Add(5);
        myList.Add(3);
        myList.Add(1);

        myList.Sort();

如果您有一百万个项目,这将更快,更高效,并且适用于字符串或日期等。

List还具有Contains方法和其他一些快捷方式,使生活更轻松。 @ThePerplexedOne是正确的,它会在列表填充后进行排序,您可以使用SortedList,它会自动在正确的位置插入项目。

答案 2 :(得分:0)

我可能会使用SortedList来解决此问题的方法更简单。

SortedList<int, object> sortedList = new SortedList<int, object>();

sortedList.Add(4, null);
sortedList.Add(1, null);
sortedList.Add(7, null);

foreach(KeyValuePair<int, object> k in sortedList)
{
    Console.WriteLine(k.Key);
}