我有一个序列。例如:
new [] { 10, 1, 1, 5, 25, 45, 45, 45, 40, 100, 1, 1, 2, 2, 3 }
现在我必须在不改变整体顺序的情况下删除重复的值。对于上面的序列:
new [] { 10, 1, 5, 25, 45, 40, 100, 1, 2, 3 }
如何用 LINQ 做到这一点?
var list = new List<int> { 10, 1, 1, 5, 25, 45, 45, 45, 40, 100, 1, 1, 2, 2, 3 };
var result = list.Where((item, index) => index == 0 || list[index - 1] != item);
var list = new List<int> { 10, 1, 1, 5, 25, 45, 45, 45, 40, 100, 1, 1, 2, 2, 3 };
List<int> result = list.Where((x, index) =>
{
return index == 0 || x != list.ElementAt(index - 1) ? true : false;
}).ToList();
这将返回您想要的。希望它有所帮助。
你试过了Distinct
吗?
var list = new [] { 10, 20, 20, 5, 25, 45, 45, 45, 40, 100, 1, 1, 2, 2, 3 };
list = list.Distinct();
编辑:由于您显然只想在连续时对具有相同值的项目进行分组,因此您可以使用以下内容:
var list = new[] { 10, 1, 1, 5, 25, 45, 45, 45, 40, 100, 1, 1, 2, 2, 3 };
List<int> result = new List<int>();
foreach (int item in list)
if (result.Any() == false || result.Last() != item)
result.Add(item);
您可以使用包含并保留顺序
List<int> newList = new List<int>();
foreach (int n in numbers)
if (newList.Count == 0 || newList.Last() != n)
newList.Add(n);
var newArray = newList.ToArray();
输出:
10, 1, 5, 25, 45, 40, 100, 1, 2, 3
使用 LINQ 解决这个问题在技术上可能是可行的(尽管我认为你不能使用单行),但我认为自己编写它更优雅。
public static class ExtensionMethods
{
public static IEnumerable<T> PackGroups<T>(this IEnumerable<T> e)
{
T lastItem = default(T);
bool first = true;
foreach(T item in e)
{
if (!first && EqualityComparer<T>.Default.Equals(item, lastItem))
continue;
first = false;
yield return item;
lastItem = item;
}
}
}
你可以像这样使用它:
int[] packed = myArray.PackGroups().ToArray();
从问题中不清楚在1,1,2,3,3,1
. 大多数给出的答案都返回1,2,3
,而我的返回1,2,3,1
。