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

时间:2018-04-05 01:19:34

标签: c# arrays

我有这个代码而且不起作用。此代码应删除数组中的每个连续副本,但它不起作用。它以与以前完全相同的格式返回数组。我有" Car"," Truck"," Truck"," Car"并得到完全相同的结果。我应该得到" Car"," Truck"," Car"。

两个阵列版本都给出了相同的结果。

版本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);
}

2 个答案:

答案 0 :(得分:0)

这对你有用。我测试了这段代码。它将操纵相同的变量。

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();

答案 1 :(得分:0)

为什么版本1和2不能正常工作

你的代码示例不起作用的原因是你(可能是因为代码不在那里)有第二个数组被初始化如下:

default(string)

所以这是一串myArray的字符串,它是空的。

然后循环result[i] != myArray[i]中的所有项目,myArray[i]的检查始终为真,除非var array = new[] { "a", "a", "a", "b", "b", "b" }; array = array.Distinct().ToArray(); 为空。

我认为你的逻辑只是想创建一个唯一项目数组。

单行解决方案

如果是这样,那么非常有效和单行的方式是:

{{1}}