Linq查询将重复项的子集减少到更大集合中的单个值?

E.B*_*ach 5 c# linq

是否有一个linq命令可以过滤掉序列中出现的重复项?

'4'的示例:

Original { 1 2 3 4 4 4 5 6 7 4 4 4 8 9 4 4 4 }
Filtered { 1 2 3 4 5 6 7 4 8 9 4 }
Run Code Online (Sandbox Code Playgroud)

谢谢.

mqp*_*mqp 5

并不是的.我写这个:

public static IEnumerable<T> RemoveDuplicates(this IEnumerable<T> sequence)
{
    bool init = false;
    T current = default(T);

    foreach (var x in sequence)
    {
        if (!init || !object.Equals(current, x))
            yield return x;

        current = x;
        init = true;
    }   
}
Run Code Online (Sandbox Code Playgroud)

  • +1,但我更喜欢这个方法更好的名字...`RemoveDuplicates`令人困惑,因为它似乎意味着删除所有重复项,而实际上只删除了*相邻*重复项.也许类似于"RemoveAdjacentDuplicates" (2认同)

Rei*_*aka 3

与 svick 的答案类似,但有副作用以避免缺点和相反:

int[] source = new int[] { 1, 2, 3, 4, 4, 4, 5, 6, 7, 4, 4, 4, 8, 9, 4, 4, 4 };

List<int> result = new List<int> { source.First() };
source.Aggregate((acc, c) =>
    {
        if (acc != c)
            result.Add(c);
        return c;
    });
Run Code Online (Sandbox Code Playgroud)

编辑:不再需要source.First()按照 mquander 的担忧:

int[] source = new int[] { 1, 2, 3, 4, 4, 4, 5, 6, 7, 4, 4, 4, 8, 9, 4, 4, 4 };

List<int> result = new List<int>();
result.Add(
    source.Aggregate((acc, c) =>
    {
        if (acc != c)
            result.Add(acc);
        return c;
    })
);
Run Code Online (Sandbox Code Playgroud)

我想我还是最喜欢Danny的解决方案。