如何根据给定的字符串数组创建一个新的字符串数组?

3
我有一个字符串数组,我需要根据长度小于3的字符串创建一个新的字符串数组。问题是我不能使用列表,所以所有操作都必须使用数组完成。
到目前为止,我已经成功筛选出所需的字符串,但是我不知道如何将它们放入一个新的数组中。再次强调,不允许使用列表,并且必须创建一个新的数组,所以我不能修改已经存在的数组。
String[] string_array1 = new String[10] {"Monday", "Tue", "Wed", "Thu", "Fri", "Saturday", "Sunday", "Pizza Day", "Catt", "Garbage Day"};

Console.WriteLine(String.Join(", ", string_array1));

String[] string_array2 = new String[i];
for (int i = 0; i < string_array1.Length; i++)
{   
    if (string_array1[i].Length < 4)
    {
        Console.Write($"{string_array1[i]}" + " ");
    }
}

必须使用数组吗?还是可以使用类似 List 这样的数据结构?能用 linq 吗?我的担忧是,数组具有固定大小,而 List 允许任意长度。如果坚持使用数组,您应该先找到满足条件的元素数量,然后初始化相应大小的数组,最后再填充数组。 - Bagus Tesa
1
String[] string_array2 = string_array1.Where(s => s.Length <= 3).ToArray() - 不使用列表。 - David
@David 在使用 linq 之前,先将它们转化为数组。我很好奇 OP 是在做一些 Codility 的东西还是日常使用。如果是 Codility 的话,OP 就得像过去那样使用迭代。 - Bagus Tesa
不清楚你在问什么。你能给我们展示一下使用 new String[10] {"Monday", "Tue", "Wed", "Thu", "Fri", "Saturday", "Sunday", "Pizza Day", "Catt", "Garbage Day"} 作为输入时的输出吗? - Enigmativity
@BagusTesa:确实,它使用了LINQ。这并不是OP提到的限制。我们可以猜测OP需求的学术性质。但如果这是一个学术问题,那么OP可能被期望解决它。(我不能确定LINQ是否在内部使用了泛型列表,但如果OP也受限于依赖于泛型列表的任何内部依赖项,那么OP需要进行大量的研究和测试。) - David
3个回答

3

一种选择是使用中间的List<string>

List<string> list = new();
for (int i = 0; i < string_array1.Length; i++)
{   
    if (string_array1[i].Length < 4)
    {
        Console.Write($"{string_array1[i]}" + " ");
        list.Add(string_array1[i]);
    }
}

var string_array2 = list.ToArray();

或者完全使用LINQ

var string_array2 = string_array1
   .Where(s => s.Length < 4)
   .ToArray();

如果你只想使用数组,那么请使用中间索引器/计数器:

string[] string_array2 = new string[string_array1.Length];
var counter = 0;
for (int i = 0; i < string_array1.Length; i++)
{   
    if (string_array1[i].Length < 4)
    {
        string_array2[counter++] = string_array1[i];
        Console.Write($"{string_array1[i]}" + " ");
    }
}

然后可选择调整数组大小 - Array.Resize(ref string_array2, counter);(以便它不包含额外的null

3
OP提到他不被允许使用列表。第二个选项可能是有效的。 - Jonathan
1
@Jonathan的代码已更新,以包含仅使用数组的解决方案。 - Guru Stron
太棒了,效果很好,非常感谢。 - Alexander Grigoriev

2

这个方法可行且不使用列表或LINQ:

String[] string_array2 = Array.FindAll(string_array1, x => x.Length < 4);

那就是:

output


0
String[] string_array2 = new String[i];

我认为你不能在这里使用 "i" 来表示数组的长度,因为你还没有声明这个变量,当你声明它时,它会成为 for 循环内部的局部变量。
String[] string_array1 = new String[10] {"Monday", "Tue", "Wed", "Thu", "Fri", "Saturday", "Sunday", "Pizza Day", "Catt", "Garbage Day"};

Console.WriteLine(String.Join(", ", string_array1));

String[] string_array2 = new String[string_array1.length];
for (int i = 0; i < string_array1.Length;)
{   
    if (string_array1[i].Length < 4)
    {
        string_array2[i] = string_array1[i];
        Console.WriteLine(string_array2[i]);
    }
    i++;
}

我已经将递增操作移到循环的末尾,这样在递增"i"之前它将运行一次,以便访问两个数组中位置0的元素。在If语句内部,如果string_array1中的值的长度小于4个字符,则将string_array2的值设置为string_array1的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接