Qanday qilib ikkita massiv bilan bir xil qiymatlarni o'tkazaman

Men "tartibida" 2 xil qatorga yopishib oldim. Mening maqsadim array1 va array2 tarkibidagi raqamlardan qutulishdir.

Mana bir misol:

int [] arr1 = {1,2,3,4,5,6 } ;
int [] arr2 = {3,4} ;

Arr1 qatoridagi qiymatlar quyidagicha bo'lishi kerak: 1,2,5,6 (3 va 4 bo'lmasa)

Hozircha kodim:

static int[] test(int[]a,int[]b)
    {
        int i = 0;
        int g = 0;
        int d = 0;

        int indexB = 0;

        while( i < a.Length)
        {

            bool dvojnost = false;

            int j = 0;
            while (j< b.Length)
                    {
                        if (trenutniElementB != indexB)
                        {
                            b[g] = b[trenutniElementB];
                            g++;
                            trenutniElementB++;
                        }
                        else
                        {
                            trenutniElementB++;
                        }
                    }
                }




            int h = 0;
            if (dvojnost == true)
            {
                while (h < a.Length)
                {
                    if (h != i)
                    {
                        a[d] = a[h];
                        d++;
                        h++;
                    }
                    else
                    {
                        h++;
                    }
                }
            }


            i++;
        }
        return a;

    }

Bu kodlash faqat bilimlarimni massivlar bilan kengaytirish uchundir :)

0
Oddiy: arr1 = arr1.Except (arr2) .ToArray ();
qo'shib qo'ydi muallif Tim Schmelter, manba
Birinchi qatorlar saralanganmi?
qo'shib qo'ydi muallif doctorlove, manba
doktorlik raqami yo'q, qatordagi qiymatlar tartiblangan emas
qo'shib qo'ydi muallif Marko Škrilec, manba

6 javoblar

LINQ :-) dan foydalaning

int[] result = array1.Except(array2).ToArray();
4
qo'shib qo'ydi

Agar siz faqat looplardan foydalanmoqchi bo'lsangiz va Linq yoki Ro'yxatga kiritilmasangiz, buni amalga oshirishingiz mumkin ...

static void Main(string[] args)
{
    int[] arr1 = { 1, 2, 3, 4, 5, 6 };
    int[] arr2 = { 3, 4 };
    int[] result = test(arr1, arr2);
}

static int[] test(int[] a, int[] b)
{
    int k = 0;
    bool toAdd;
    int[] output = new int[] { };

    for (int i = 0; i < a.Length; i++)
    {
        toAdd = true;

        for (int j = 0; j < b.Length; j++)
        {
            if (a[i] == b[j])
            {
                toAdd = false;
                break;
            }
        }
        if (toAdd)
        {
            Array.Resize(ref output, k + 1);
            output[k] = a[i];
            k++;
        }             
    }
    return output;
}
2
qo'shib qo'ydi
Bu men izlayotgan narsa. ma'rifat uchun minnatdormiz :)
qo'shib qo'ydi muallif Marko Škrilec, manba

G'ildirakni qayta kashf qilmang, LINQdan foydalaning. Qanday bo'lmasin, agar siz buni massivlarni tushunish uchun bajarayotgan bo'lsangiz, mana bu erda LINQ-ni bekor qiladigan xatti-harakatlar:

public static T[] Except(this T[] first, T[] second)
{
    if (first == null)
        throw new ArgumentNullException(nameof(first));

    if (second == null)
        throw new ArgumentNullException(nameof(second));

    if (second.Length == 0)
        return first;

    var counter = 0;
    var newArray = new T[first.Length];

    foreach (var f in first)
    {
        var found = false;

        foreach (var s in second)
        {
            if (f.Equals(s))
            {
                found = true;
                break;
            }
        }

        if (!found)
        {
            newArray[counter] = f;
            counter++;
        }
    }

    Array.Resize(ref newArray, counter);
    return newArray;
}
0
qo'shib qo'ydi

Buni hech qanday generic koleksiyonlari holda sinashingiz mumkin :) Faqatgina massivlar:

public class Program
{
    static void Main(string[] args)
    {
        int resultLength = 0;
        int[] arr1 = { 1, 2, 3, 4, 5, 6 };
        int[] arr2 = { 3, 4 };
        int[] result = new int[resultLength];

        for(int i = 0; i < arr1.Length; i++)
        {
            if(!arr2.Exists(arr1[i]))
            {
                resultLength++;
                Array.Resize(ref result, resultLength);
                result[resultLength- 1] = arr1[i];
            }
        }            
    }
}

public static class MyExtensions
{
    public static bool Exists(this int[] array, int value)
    {
        for(int i = 0; i < array.Length; i++)
        {
            if (array[i] == value)
                return true;
        }
        return false;
    }
}
0
qo'shib qo'ydi

If you are treating second array as exclusion list for your result then maybe using generic List<> class will be enough to create simple code like this:

    static int[] test(int[] a, int[] b)
    {
        List result = new List();
        List exclusion = new List(b);
        for (int i = 0; i < a.Length; i++)
        {
            if (exclusion.IndexOf(a[i]) >= 0)
                continue;
            result.Add(a[i]);
        }
        return result.ToArray();
    }
0
qo'shib qo'ydi
Yuqorida aytib o'tganimdek, looplardan, .length va o'zgarmaydiganlardan boshqa narsalarni ishlatishni xohlamayman
qo'shib qo'ydi muallif Marko Škrilec, manba

Sizning usulingizni 2 qismga bo'ling. Avval dublikatlarni o'chiring va keyin qatorni tartiblang:

public int[] RemoveAndSort(int[] a, int[] b){
  List temp = new List();
  for(int i = 0; i < a.Length; i++){
    bool found = false;
    for(int j = 0; j < b.Length; j++){
      if(a[i] == b[j]){
        found = true;
      }
    }
    if(!found) temp.Add(a[i]);
  }
  temp.Sort();
  return temp.ToArray();
}

Men yechimda List ishlatilgan, lekin usulning boshida a bilan bir xil uzunlikdagi yangi bo'sh qatorni ham ishlatishingiz mumkin.

0
qo'shib qo'ydi