C# 将数字插入排序位置的列表框中
C# inserting numbers into a list box in sorted position
请先打扰一下我的笨蛋post。我对大学作业有疑问。分配是 "Number list manager",基本上用户选择一个单选按钮(排序或未排序),当他们单击按钮时,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# 方法,例如插入到未排序的列表中只需要将新值放在当前最后一个条目之后的下一个可用位置,而插入到排序列表中则需要您的代码找到插入点并将任何更高值的条目移动到 open/free 向上包含新值的插入点。
我不是要任何人为我做这项工作,但即使是伪代码也会非常感激
您已经遍历列表并读取每个值,因此您需要做的就是检查现有值是否大于您插入的值。如果是这样,您应该将其插入您刚刚检查的项目之前。
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# 中对列表进行排序的最佳方法不是使用数组,而是使用列表或其他 class 有自己的排序方法。
var myList = new List<int>();
myList.Add(5);
myList.Add(3);
myList.Add(1);
myList.Sort();
如果你有一百万个项目,这会更快、更有效,而且它适用于字符串或日期或其他任何东西。
List
也有一个 Contains
方法,以及其他几个让生活更轻松的快捷方式。 @ThePerplexedOne 是正确的,在填充列表后进行排序,您可以使用 SortedList,它会自动将项目插入正确的位置。
好的,首先我不确定这些检查列表是否已满的全部内容是什么,你不能每次按下按钮并迭代 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);
}
}
我使用 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);
}
请先打扰一下我的笨蛋post。我对大学作业有疑问。分配是 "Number list manager",基本上用户选择一个单选按钮(排序或未排序),当他们单击按钮时,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# 方法,例如插入到未排序的列表中只需要将新值放在当前最后一个条目之后的下一个可用位置,而插入到排序列表中则需要您的代码找到插入点并将任何更高值的条目移动到 open/free 向上包含新值的插入点。
我不是要任何人为我做这项工作,但即使是伪代码也会非常感激
您已经遍历列表并读取每个值,因此您需要做的就是检查现有值是否大于您插入的值。如果是这样,您应该将其插入您刚刚检查的项目之前。
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# 中对列表进行排序的最佳方法不是使用数组,而是使用列表或其他 class 有自己的排序方法。
var myList = new List<int>();
myList.Add(5);
myList.Add(3);
myList.Add(1);
myList.Sort();
如果你有一百万个项目,这会更快、更有效,而且它适用于字符串或日期或其他任何东西。
List
也有一个 Contains
方法,以及其他几个让生活更轻松的快捷方式。 @ThePerplexedOne 是正确的,在填充列表后进行排序,您可以使用 SortedList,它会自动将项目插入正确的位置。
好的,首先我不确定这些检查列表是否已满的全部内容是什么,你不能每次按下按钮并迭代 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);
}
}
我使用 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);
}