C# 如何根据元素的数量缩小int数组?

C# 如何根据元素的数量缩小int数组?,c#,C#,假设我有一个包含100个元素的基本int[]tab数组。我想使用存储不兼容元素的tmp数组执行Erastotenes的筛选。因为我不知道这个数组中到底有多少个元素,所以我将它声明为newint[100]。但在执行填充任务后,有没有办法缩小该数组?例如,我最终得到的是46个数字而不是100个,因此我想根据所述元素的数量相应地缩小该数组的大小。我希望避免手动调整大小,我更希望通过编程来实现 示例代码: int[] tab = new int[100]; int[] tmp = new

假设我有一个包含100个元素的基本
int[]tab
数组。我想使用存储不兼容元素的tmp数组执行Erastotenes的筛选。因为我不知道这个数组中到底有多少个元素,所以我将它声明为
newint[100]
。但在执行填充任务后,有没有办法缩小该数组?例如,我最终得到的是46个数字而不是100个,因此我想根据所述元素的数量相应地缩小该数组的大小。我希望避免手动调整大小,我更希望通过编程来实现

示例代码:

    int[] tab = new int[100];
    int[] tmp = new int[100];

    for(int i = 0; i < tab.Length; i++) {
        tab[i] = i;
    }
publicstaticvoidresize(reft[]?数组,int newSize);
此方法分配具有指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。数组必须是一维数组。 将一维数组的元素数更改为指定的新大小


您可以

不,您不能缩小阵列(或者增长阵列)。您可以创建具有正确大小的新阵列,并将数据复制到新阵列,但阵列一旦创建,就无法更改大小

实现这一点的最简单方法是使用
List
,它只不过是数组上的一个薄包装器,隐藏了底层数组需要如何以及何时增长的所有管道,并将数据从“耗尽”的数组复制到较新的数组


填充列表后,如果需要数组,只需调用
ToArray()

就可以使用列表而不是数组,并使用tab.Add(i);是的,我在其他地方看到过这种解决方案,但我想用标准的int数组来解决。你知道数组最后一个值元素的索引吗?@Steve遗憾的是,不知道,因为它完全取决于tab数组的内容。我必须循环遍历它。那么,当原始数组的元素没有从代码中更改时,您如何区分呢?我的意思是int的默认值是零。零是填充数组的算法的可接受结果吗?谢谢,但我不想使用内置C#方法,我想找出我自己的解决方案。在知道大小后创建一个新数组如何?请记住,实际上
Resize
不会调整原始数组的大小。它只是创建一个具有新大小的新文件,并将相关数据从一个文件复制到另一个文件。是的,我知道。在你提到数组中不能在声明之后修改C数组之后,所有的东西都会点击。也许这只是我的C++习惯,实际上可以调整数组的大小。好吧,那样的话,我得按照你的建议去做。谢谢
            int[] tab = new int[100];
            List<int> tmp = new List<int>();
            List<int> se = new List<int>();

            for(int i = 0; i < tab.Length; i++)
            {
                tab[i] = i + 2;
            }

            se.Add(tab[0]);
            se.Add(tab[1]);

            for (int i = 2; i < tab.Length; i++)
            {
                if (tab[i] % 2 == 0 || tab[i] % 3 == 0)
                {
                    if (tmp.IndexOf(tab[i]) == -1)
                    {
                        tmp.Add(tab[i]);
                    }
                }
            }

            int k = 3;
            int value;

            while(k < tab.Length)
            {
                if(tmp.IndexOf(tab[k]) == -1) {
                    value = tab[k];
                    for (int i = k; i < tab.Length; i++)
                    {
                        if(tmp.IndexOf(tab[i]) == -1)
                        {
                            if(tab[i] % value == 0 && tab[i] != value)
                            {
                                tmp.Add(tab[i]);
                            }
                            else
                            {
                                if(se.IndexOf(tab[i]) == -1)
                                {
                                    se.Add(tab[i]);
                                }
                            }
                        } 
                    }
                }
                k++;
            }

            Console.WriteLine("Zawartość tablicy początkowej:");
            for(int i = 0; i < tab.Length; i++)
            {
                Console.Write(tab[i] + " ");
            }
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Elementy wykluczone:");
            foreach(int t in tmp)
            {
                Console.Write(t + " ");
            }
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("Sito Erastotenesa:");
            foreach (int s in se)
            {
                Console.Write(s + " ");
            }
            Console.WriteLine();
            Console.WriteLine();
public static void Resize<T> (ref T[]? array, int newSize);