2013-11-03 89 views
3

所以這裏是我的數組。如何檢查我的數組內部是否有重複值?

double[] testArray = new double[10]; 
// will generate a random numbers from 1-20, too lazy to write the code 

我想做一個搜索循環來檢查是否有任何值正在重複。我怎麼做?

我不想使用任何特殊的內置方法,因爲這是一個小陣列。

回答

16

你可以用少許的Linq做到這一點:

if (testArray.Length != testArray.Distinct().Count()) 
{ 
    Console.WriteLine("Contains duplicates"); 
} 

Distinct擴展方法刪除任何重複,Count得到結果集的大小。如果它們完全不同,那麼列表中有一些重複項。

可替代地,這裏的更復雜的查詢,但也可以是更多的有效的:

if (testArray.GroupBy(x => x).Any(g => g.Count() > 1)) 
{ 
    Console.WriteLine("Contains duplicates"); 
} 

GroupBy方法將基團的任何相同的元件一起,和Any返回true如果任何組中有一個以上的元件。

上述兩種解決方案通過利用HashSet<T>工作,但你可以直接使用一個這樣的:

if (!testArray.All(new HashSet<double>().Add)) 
{ 
    Console.WriteLine("Contains duplicates"); 
} 

或者如果你喜歡,不依賴於LINQ的在所有的解決方案:

var hashSet = new HashSet<double>(); 
foreach(var x in testArray) 
{ 
    if (!hashSet.Add(x)) 
    { 
     Console.WriteLine("Contains duplicates"); 
     break; 
    } 
} 
+0

哦好,謝謝。 Distinct()。Count()應該做的一般是什麼? – puretppc

+0

@Mike查看我的更新回答 –

+0

哦,我明白了。所以如果我只想檢查重複項,那麼我只是刪除Distinct()的權利? Count()方法意味着它有多少次與結果集的大小一樣重複? – puretppc

1

使用此:

bool CheckUniqueness(double[] values) 
{ 
    var uniqueValues = new HashSet<double>(); 
    foreach (double d in values) 
    { 
     if(uniqueValues.Contains(d)) 
     { 
      return false; 
     } 
     uniqueValues.Add(d); 
    } 
    return true; 
} 
0

帶(OP)10個隨機雙打相當快。 重複的機會:〜0.000002%。

static bool repeat(double[] a) 
{ 
    return 
     a[0] == a[1] || a[0] == a[2] || a[0] == a[3] || a[0] == a[4] || 
     a[0] == a[5] || a[0] == a[6] || a[0] == a[7] || a[0] == a[8] || 
     a[0] == a[9] || a[1] == a[2] || a[1] == a[3] || a[1] == a[4] || 
     a[1] == a[5] || a[1] == a[6] || a[1] == a[7] || a[1] == a[8] || 
     a[1] == a[9] || a[2] == a[3] || a[2] == a[4] || a[2] == a[5] || 
     a[2] == a[6] || a[2] == a[7] || a[2] == a[8] || a[2] == a[9] || 
     a[3] == a[4] || a[3] == a[5] || a[3] == a[6] || a[3] == a[7] || 
     a[3] == a[8] || a[3] == a[9] || a[4] == a[5] || a[4] == a[6] || 
     a[4] == a[7] || a[4] == a[8] || a[4] == a[9] || a[5] == a[6] || 
     a[5] == a[7] || a[5] == a[8] || a[5] == a[9] || a[6] == a[7] || 
     a[6] == a[8] || a[6] == a[9] || a[7] == a[8] || a[7] == a[9] || 
     a[8] == a[9]; 
} 

更一般情況下,用10號比上面慢〜2倍,比HashSet的方法快
但〜7倍。

static bool repeat(double[] a) 
{ 
    int k = a.Length - 1; 
    if (k < 70) 
    { 
     double aj; 
     for (int i = 0, j; i < k;) 
     { 
      for (aj = a[k--], j = k; j >= i; j--) 
       if (aj == a[j]) return true; 
      for (aj = a[i++], j = i; j <= k; j++) 
       if (aj == a[j]) return true; 
     } 
     return false; 
    } 
    var h = new HashSet<double>(); 
    while (k >= 0) if (!h.Add(a[k--])) return false; 
    return true; 
} 

兩行(有重複慢;)

static bool repeat(double[] a) 
{ return (new HashSet<double>(a).Count < a.Length); } 
0

採取看看我的實現其genericefficient

public static bool HasDuplicates<T>(IList<T> items) 
    { 
     Dictionary<T, bool> map = new Dictionary<T, bool>(); 
     for (int i = 0; i < items.Count; i++) 
     { 
      if (map.ContainsKey(items[i])) 
      { 
       return true; // has duplicates 
      } 
      map.Add(items[i], true); 
     } 
     return false; // no duplicates 
    } 

這裏有一些電話

string[] strings = new[] { "1", "2", "3" }; 
Utility.HasDuplicates(strings)// this will return false 

int[] items=new []{1,2,3,1}; 
Utility.HasDuplicates(items)// this will return true 
相關問題