2014-10-27 86 views
0

我想删除此数组中的所有重复项,但我无法完成它的工作。当所有重复项都被删除时,我想创建一个新的数组而不删除数字。这里是我的代码:删除阵列中的重复项并创建一个新阵列

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

您已经成功创建了一个没有任何重复的数组。做得好/ patsback。 – Servy 2014-10-27 17:12:02

+2

如果你不想知道数组类型的全名,那么'q.ToString()'是毫无意义的。改用'string.Join(“,”,q)'。 – 2014-10-27 17:14:04

+0

@BradleyDotNET是的。然后我想在我的控制台应用程序中写出它。 – Fredrik 2014-10-27 17:14:06

回答

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

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

若要去重复的所有项目,也就是一个“计数”大于1:

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

这是O(n^2),所以不这样做在一个大采集。

+0

downvoter会照顾评论吗? – BradleyDotNET 2014-10-27 17:50:52

+0

不是downvoter,但它可能是因为这段代码不会像编写的那样编译(请参阅lambda中的'q' [你的意思是's',但是你打错了])。 – Michael 2014-10-27 17:58:30

+0

@Michael谢谢你指出这个错误。我已纠正它。 – BradleyDotNET 2014-10-27 18:00:04

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

+0

@BradleyDotNET:唔,不这么认为。当遇到第一个12时,'occurrenceOnce'将是'false' - 最后一次迭代评估第二个11。将添加11的'if'块被跳过,并且'currentItem'和'occurrenceOnce'被重置。在随后的迭代中,currentItem等于12,'occurrenceOnce'标志将被设置为'false'。我用一个工作示例更新了我的答案。 – 2014-10-27 17:45:57

+0

是的,你说得对,我读错了。对困惑感到抱歉。 – BradleyDotNET 2014-10-27 17:51:45

-1

我不能此刻却代码..但这里是我的思维过程....

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

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

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

+0

如果你只是在打印,那么它就可以正常工作,但是获得最终的集合,然后打印它,通常会更有用。 – BradleyDotNET 2014-10-27 17:52:49