从数组中删除重复项并创建一个新数组

时间:2014-10-27 17:10:56

标签: c# arrays linq

我想删除此数组中的所有重复项,但我无法使其正常工作。删除所有重复项后,我想创建一个没有删除数字的新数组。这是我的代码:

  static void Main(string[] args)
    {
        int[] s = { 11, 11, 12, 12, 13, 13, 14, 15, 16 };
        int[] q = s.Distinct().ToArray();

        Console.WriteLine(q.ToString());
        Console.ReadLine();
    }

打印阵列{11,12,13,14,15,16};但我希望它能打印阵列{14,15,16}。

4 个答案:

答案 0 :(得分:2)

使用:

int[] s = { 11, 11, 12, 12, 13, 13, 14, 15, 16 };
var NotDuplicateItems = s.GroupBy(r => r)
    .Where(grp => grp.Count() == 1)
    .Select(r => r.Key)
    .ToArray();

以上内容将为您提供数组s

中不重复的项目

答案 1 :(得分:1)

Distinct返回一个删除了所有重复条目的集合。但是,它不会删除原始项目(稍后重复)。

删除所有重复的项目,即具有" Count"大于1:

int[] q = s.Where(i => s.Count(j => j == i) == 1).ToArray();

这是O(n ^ 2),所以不要在大型​​集合上这样做。

答案 2 :(得分:1)

如果您知道您的输入数组将被排序(在您的示例中),您应该利用它。如果这样做,您可以迭代一次数组:

public int[] RemoveDuplicates(int[] source)
{
    bool occurredOnce = true;
    int currentItem = source[0];

    var result = new List<int>();

    for (int i = 1; i < source.Length; i++)
    {
        if (source[i] != currentItem)
        {
            if (occurredOnce)
            {
                result.Add(currentItem);
            }

            currentItem = source[i];
            occurredOnce = true;
        }
        else 
        {
            occurredOnce = false;
        }
    }

    if (occurredOnce)
    {
        result.Add(currentItem);
    }

    return result.ToArray();
}

示例: https://dotnetfiddle.net/4qgEFs

答案 3 :(得分:-1)

我现在无法编码..但这是我的思考过程......

取第一个数字,然后将其从字符串(或数组)的其余部分中删除。

然后搜索刚刚在字符串(或数组)中删除的那个数字。

如果再次发现,则不会打印该号码。如果没有 - 则显示数字。