2014-10-27 151 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