如何使用LINQ对序列中的相同值进行分组?

时间:2012-05-26 12:07:02

标签: c# .net linq

我有一个序列。例如:

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执行此操作?

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

这会返回您想要的内容。希望它有所帮助。

答案 2 :(得分:1)

<击> 你试过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);

答案 3 :(得分:1)

您可以使用包含并保留订单

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

答案 4 :(得分:1)

技术上可能(尽管我认为你不能用单行代码)用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