2012-06-15 129 views
0
bool hasDuplicate = false; 
int[] a = new int[] {1, 2, 3, 4}; 
int[] b = new int[] { 5, 6, 1, 2, 7, 8 }; 

我需要數組A中的所有元素與陣列B的元素,並在乙重複元件,設置hasDuplicate上TRUE的情況下進行比較。在C#比較兩個陣列

+0

如果您發佈了您嘗試過的內容,我們可能會指出您錯誤的地方,也許。既然你沒有,[我們不必爲你做功課](http://meta.stackexchange.com/a/128572)。 –

+0

嚴肅地說,該代碼不會編譯。看看你的數組聲明 –

+0

現在客戶聲明應該沒問題 – GibboK

回答

4

由於這是家庭作業,我會給你一個功課回答。

當然,你可以使用LINQ並依靠SequenceEqual,Intersect等,但這可能不是練習的要點。

給定兩個數組,您可以使用foreach迭代數組中的元素。

int[] someArray; 
foreach(int number in someArray) 
{ 
    //number is the current item in the loop 
} 

所以,如果你有兩個數組是相當小的,你可以遍歷在所有項目的第一陣列,然後循環的每個號碼第二陣列中和比較。讓我們試試。首先,我們需要糾正你的數組語法。它應該是這個樣子:

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

注意使用大括號{的。您正在使用該語法來創建一個N維數組。

bool hasDuplicate = false; 
int[] a = new int[] { 1, 2, 3, 4 }; 
int[] b = new int[] { 5, 6, 7, 8 }; 
foreach (var numberA in a) 
{ 
    foreach (var numberB in b) 
    { 
     //Something goes here 
    } 
} 

這讓我們非常接近。我鼓勵你從這裏嘗試一下。如果您仍然需要幫助,請繼續閱讀。


好的,所以我們基本上只需要檢查數字是否相同。如果是,則將hasDuplicate設置爲true。

bool hasDuplicate = false; 
int[] a = new int[] { 8, 1, 2, 3, 4 }; 
int[] b = new int[] { 5, 6, 7, 8 }; 
foreach (var numberA in a) 
{ 
    foreach (var numberB in b) 
    { 
     if (numberA == numberB) 
     { 
      hasDuplicate = true; 
     } 
    } 
} 

這是一個非常「粗暴」的方法。循環的複雜性是O(n ),但在您的情況下可能無關緊要。使用LINQ的其他答案肯定更有效,如果效率很重要,那麼可以考慮這些。另一種選擇是使用break「停止」循環,如果hasDuplicate爲真,或將此代碼放在方法中並使用return退出該方法。

3

我知道你不想要一個在線解決方案,但我會離開我爲其他用戶回答誰可能要對同一問題的簡單解決方案。

如果你不想使用Linq,你可以使用SequenceEqual

bool equal = Array1.SequenceEqual(Array2);

希望它能幫助。

4

如果學習是你尋求和算法中是你想要什麼樣拿出,然後使用LINQ和其他爵士不會幫你。

你需要有2套foreach(或for,無論你喜歡)循環,一旦你在第一圈的成員在第二循環中找到的匹配一員,您的布爾變量設置爲true,break

+0

+1真是這樣做的算法。 – phadaphunk

4

不是最高效的,但可能是最容易理解的方法是這樣的:

foreach (int _a in a) { // iterate through all elements in array a (as _a) 
    foreach (int _b in b) { // iterate through all elements in array b (as _b) 
     if (_a == _b) { // if we've got a duplicate 
      hasDuplicates = true; // store that for later on 
      break; // immediately leave this loop (no point in further looking up) 
     } 
    } 
    if (hasDuplicates) { // if we've got a duplicate 
     break; // leave this loop as well (no point in further looking up) 
    } 
} 

很顯然,這並不是最高效的解決方案的複雜性會O(n²),這意味着元素數量的兩倍在任何一個陣列將增加一倍所需的時間來完成操作(最壞情況)的量;在兩個陣列元件的數量的兩倍將四倍的時間量。

更優雅的解決方案是使用其他一些解決方案中描述的預定義的方法,但由於這是作業的東西,我不認爲您可以使用這些「快捷方式」(或應該做的所以)。

一定要記住:即使你在這裏找到解決方案,試着去了解他們,使用他們的靈感,然後自己編寫。這可能是最好的學習方式。不要只是複製粘貼&。

3

Eventhough LINQ將幫助你用一行代碼做到這一點,這是更好地理解它是如何工作的,因爲你在你的問題:)

循環數組通和提詞算法比較每項目與第二個數組中的項目。如果存在,則返回true。否則爲假。我想包,在這樣的函數

public bool IsPresentInArray(int[] firstArray, int[] secondArray) 
{ 
    foreach (var itemA in firstArray) 
    { 
     foreach (var itemB in secondArray) 
     { 
      if (itemB == itemA) 
      {      
       return true; 
      } 
     } 
    } 
    return false; 
} 

現在我可以這樣調用

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

bool present= IsPresentInArray(a, b); 

閱讀foreach循環here

+0

非常感謝這個 – GibboK

+0

@GibboK:你好,歡迎光臨。 :) 很高興我能幫上忙。 – Shyju

2

要有效比較一組中的所有元素到另一組中,您可以製作其中一個組的HashSet。另外,還可以一旦退出圈外,你找到第一個匹配:

HashSet<int> h = new HashSet<int>(a); 
foreach (int i in b) { 
    if (h.Contains(i)) { 
    hasDuplicate = true; 
    break; 
    } 
} 

這是O(N + M)溶液中,相比於具有比較所有值,其爲O兩個嵌套環( n * m)解決方案。

0

我用一個「IndexOf」和「foreach」循環來創建這個。 (注意:前3個「字符串」行只是您如何創建數組並將其轉換爲正確格式的示例)。

如果要比較2個數組,它們將用分號分隔,但最後一個值在後面不會有一個。如果在數組的字符串形式(即a; b; c變成a; b; c;)後附加一個分號,可以使用「x;」匹配不管它在什麼位置:

bool found = false; 
string someString = "a-b-c"; 
string[] arrString = someString.Split('-'); 
string myStringArray = arrString.ToString() + ";"; 

foreach (string s in otherArray) 
{ 
    if (myStringArray.IndexOf(s + ";") != -1) { 
     found = true; 
     break; 
    } 
} 

if (found == true) { 
    // .... 
} 
0

爲什麼我們不嘗試使用LINQ? 看看下面的代碼,

public bool Checking() 
    { 
     bool hasDuplicate = false; 
     int[] a = new int[] { 1, 2, 3, 4 }; 
     int[] b = new int[] { 5, 6, 1, 2, 7, 8 }; 

     int count = a.Intersect(b).Count(); 
     if (count >= 1) 
      hasDuplicate = true; 

     return hasDuplicate; 

    } 
0

for循環做到了。重點是我們將每個成員與數組b中的成員進行比較。因此,a[0]首先與數組b中的每個成員進行比較,然後進入a[1]並執行相同的操作,依此類推,直至找到匹配。

bool hasDuplicate = false; 

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

for (int i = 0; i < a.Length; i++) 
{ 
    for (int j = 0; j < b.Length; j++) 
    { 
     if (a[i] == b[j]) 
     { 
      hasDuplicate = true; 
     } 
    } 
}