我在分配作业时遇到麻烦。有人可以帮我解释一下我该怎么做吗?
这是作业:编写一个程序,该程序将出现多次的元素的有序数组缩短,以删除重复项,因此最终每个元素仅出现一次。 我们不使用排序,也不会生成新的数组。
我尝试了很多次,填充数组没问题,但是剩下的就是
这是我的一些作品:
//aanmaken en vullen van de array
int[] getallen = new int[] { 1, 1, 2, 2, 3, 4, 4, 4, 5, 6 };
//in volgende loop geven we de getallen weer uit de originele array
for (int teller = 0; teller < 10; teller++)
{
Console.Write(getallen[teller] + " ");
}
Console.Write("==> ");
Console.Write(getallen[0] + " ");
//in volgende loop geven we enkel de unieke getallen uit de array
weer
for (int teller = 1; teller < 10; teller++)
{
if (getallen[teller] != getallen[teller - 1])
{
Console.Write(getallen[teller] + " ");
}
Console.ReadLine();
因此应该是:输入:int [] getallen = new int [] {1,1,2,2,3,4,4,4,5,6};输出:{1,2,3,4,5,6}
答案 0 :(得分:1)
要生成{1,2,3,4,5,6}
作为结果(即删除重复的相邻条目),请考虑以下方法:
using System;
using System.Collections.Generic;
namespace Test
{
public class Program
{
public static IEnumerable<int> RemoveDuplicates(int[] input)
{
int? old = null;
foreach (var value in input)
{
if (value != old)
yield return value;
old = value;
}
}
public static void Main()
{
int[] getallen = new int[] { 1, 1, 2, 2, 3, 4, 4, 4, 5, 6 };
Console.WriteLine(string.Join(",", RemoveDuplicates(getallen)));
Console.ReadLine();
}
}
}
IEnumerable<int>
不使用数组就返回值,而yield return
用于一次返回一个非重复项。
value
与old
进行比较,以确保忽略重复的相邻条目。
string.Join
用于将值与它们之间的,
串联在一起,因此它们在控制台上的打印效果很好。
从性能角度考虑,将old
声明更改为int old = (input?.FirstOrDefault() ?? 1) + 1;
也可能会有所帮助,以便不涉及可空类型。为了清晰起见,我更喜欢将其保留为可为null的类型。)
答案 1 :(得分:1)
public void ShortenArray()
{
int[] getallen = new int[] { 1 , 1 , 2 , 2 , 3 , 4 , 4 , 4 , 5 , 6 };
getallen = getallen.ToList().Distinct().ToArray();
}
说明:
Linq-List提供了方法Distinct()。此方法删除重复项,但保持顺序。此外,Linq使您能够将数组转换为列表,反之亦然。
一种替代方法是检查数组中的每一项是否已经设置过,以新的方式替换各项,以确保所有“空”值都在末尾并使用* Array.Resize( / ** /)*方法来缩短数组。要获得相同的结果,还有很多工作要做。