我有此代码,并且它不起作用。该代码应删除数组中的每个连续重复,但不起作用。它以以前以完全相同的格式返回数组。我有"汽车","卡车","卡车","汽车",结果完全相同。我应该得到"汽车","卡车","汽车"。
两个数组版本都给出相同的结果。
版本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();