2012-06-15 4 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 и в случае дублирования элемента в 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, в зависимости от того, который вы предпочитаете) петли, и как только вы нашли элемент в первом цикле, соответствующего члена во втором цикле, установить логическую переменную для истинны и 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

LINQ Eventhough поможет вам сделать это с помощью одной строки кода, лучше понять, как это работает, потому что вы упомянули слово алгоритм в вашем вопросе :)

Loop через массив и сравнить каждый элемент с элементами во втором массиве. Если он присутствует, верните true. else false. Я бы завернуть, что в функции как этот

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); 

Читать о цикле Еогеасп 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; 
     } 
    } 
} 
Смежные вопросы