在不减小列表大小的情况下删除List <>中位于索引位置的值

时间:2018-10-23 17:59:26

标签: c#

我正在尝试创建一个结构数组,并从中添加/删除项目。试图将其转换为列表,请删除该位置本身在给定索引处的项目。  如果我对列表使用RemoveAt(index)方法,它将以一个位置减小列表大小。最终数组的大小应与开头的大小相同。

struct Cities
{
    public string name;

    public int inhabitansNumber;
}
Cities[] cities = new Cities[500]; // the struct array holding the cities
int i = 0;


//insert items into the array:
if (cities[i].Equals(default(Cities)))
{
    Console.WriteLine("Please enter the city name:");
    cities[i].name = Console.ReadLine();
    Console.WriteLine("Please enter population:");
    cities[i].inhabitansNumber = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("Values added successfuly!");
    i++;
}


//remove values from the array:
Console.WriteLine("number of element BEFORE deleting in array {0}", cities.Count());
Console.WriteLine("please enter the position of the element that you want to delete:");
int numToRemove = Convert.ToInt32(Console.ReadLine());
List<Cities> citiesToList = cities.ToList();
citiesToList.RemoveAt(numToRemove);
cities = citiesToList.ToArray();
Console.WriteLine("number of element AFTER deleting in array {0}", cities.Count());

3 个答案:

答案 0 :(得分:2)

如上所述,最好将指定索引上的项目设置为null,而不是完全删除该项目。

myArray[itemIndex] = null;

因为您正在使用结构,所以这是不可能的。但是也许您可以将数组声明为可为空。所以只要改变

Cities[] cities = new Cities[500];

到以下

Cities?[] cities = new Cities?[500];

答案 1 :(得分:1)

声明元素类型为可为空的数组/列表:

Cities?[] cities = new Cities?[500];
List<Cities?> citiesToList = cities.ToList();

如果您不想使数组可为空,则可以通过以下方式仅更改列表:

List<Cities?> citiesToList = cities.Cast<Cities?>.ToList();

然后可以使用列表索引器并将元素设置为null:

citiesToList[numToRemove] = null;

答案 2 :(得分:0)

仅使用for循环找到了解决方案。希望它也可以帮助您:)

//removing item from array without deleting the position
Console.WriteLine("number of element BEFORE deleting in array {0}", cities.Count());
Console.WriteLine("please enter the position of the element that you want to delete:");
int numToRemove = Convert.ToInt32(Console.ReadLine());
for (int j = 0; j < cities.Length-1; j++)
{
    if (j >= numToRemove)
    {
        cities[j] = cities[j + 1];
    }
}
Console.WriteLine("number of element AFTER deleting in array {0}", cities.Count());