为什么此代码不起作用?删除数组中的连续重复条目



我有此代码,并且它不起作用。该代码应删除数组中的每个连续重复,但不起作用。它以以前以完全相同的格式返回数组。我有"汽车","卡车","卡车","汽车",结果完全相同。我应该得到"汽车","卡车","汽车"。

两个数组版本都给出相同的结果。

版本1:

for (int i = 0; i < array.Length; i++)
{
    if (i == 0 || result[i - 1] != array[i])
    {
        result[i] = array[i]; 
    }
}

版本2:

result[0] = array[0];
for (int i = 1; i < array.Length; i++)
{
    if (i == 0 || result[i - 1] != array[i])
    {
        result[result.Length - i] = array[i]; 
    }
}

但是,使用数组列表的下面代码有效。有人可以启发我为什么会发生这种情况吗?

List<string> results = new List<string>(); 
foreach (string element in array)
{
    if (results.Count == 0 || results.Last() != element)
        results.Add(element);
}

为什么版本1和2不起作用

您的代码示例不起作用的原因是您(大概是因为代码不存在(,有一个像这样初始化的第二个数组:

var result = string[myArray.Length]

所以这是一堆 default(string)的字符串。

然后循环myArray中的所有项目,并且result[i] != myArray[i]的检查始终是正确的,除非myArray[i]为null。

我认为您的逻辑正在尝试简单地创建一个 unique 项目的数组。

单行解决方案

如果这样做是一种非常高效且一线的方法是:

var array = new[] { "a", "a", "a", "b", "b", "b" };
array = array.Distinct().ToArray();

这将适用于您。我测试了此代码。它将操纵相同的变量。

var myArray = new string[] { "Car", "Truck", "Truck", "Car" }.ToList();
for (int i = 0; i < myArray.Count() - 1; i++)
{
    if (myArray[i].Equals(myArray[i + 1]))
    {
        myArray.RemoveAt(i);
        i--;
    }
}

您需要从结果数组中删除所有空值。检查下面代码的更新版本。

var myArray = new string[] { "Car", "Truck", "Truck", "Car" };
var result = new string[myArray.Length];

版本1

for (int i = 0; i < myArray.Length; i++)
{
    if (i == 0 || result[i - 1] != myArray[i])
    {
        result[i] = myArray[i];
    }
}

版本2

result[0] = myArray[0];
for (int i = 1; i < myArray.Length; i++)
{
    if (result[i - 1] != myArray[i])
    {
        result[i] = myArray[i];
    }
}

在您的两个版本上删除空值后都执行以下操作。

result = result.Where(r => r != null).ToArray();

最新更新