Почему массив выдает такой результат? С#

110
18 апреля 2022, 02:10

Результат должен быть просто 1,но почему то результат 2,1,2. Метод ArrayDiff должен из массива a удалять все такие же цифры, которые есть в массиве b.

Код:

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public static class Kata
{
    public static int[] ArrayDiff(int[] a, int[] b)
    {
        List result = new List();
        result = a.ToList();
        for(int BNumber = 0; BNumber != b.Length; BNumber++)
        {
            for(int ANumber = 0; ANumber != a.Length; ANumber++)
            {
                // Debug.Log(b[BNumber] + " " + a[ANumber]);
                if (a[ANumber] != b[BNumber])
                {
                    // Debug.Log($"Удаляем элемент! номер элемента: {a[ANumber]}");
                    result.Remove(ANumber);
                }
                else
                {
                    // Debug.Log("Оставляем элемент!");
                }
            }
        }
        return result.ToArray();
    }
}
public class Test : MonoBehaviour
{
    void Start()
    {
        int[] array = Kata.ArrayDiff(new int[] { 2, 2, 1, 2 }, new int[] { 1 });
        foreach(int i in array)
        {
            Debug.Log( array[i] );
        }
    }
}
Answer 1

Потому что, там где у Вас result.Remove(ANumber); - ANumber это индекс в массиве, а не сам элемент

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public static class Kata
{
    public static int[] ArrayDiff(int[] a, int[] b)
    {
        List result = new List();
        result = a.ToList();
        for(int BNumber = 0; BNumber != b.Length; BNumber++)
        {
            for(int ANumber = 0; ANumber != a.Length; ANumber++)
            {
                // Debug.Log(b[BNumber] + " " + a[ANumber]);
                if (a[ANumber] != b[BNumber])
                {
                    // Debug.Log($"Удаляем элемент! номер элемента: {a[ANumber]}");
                    //result.Remove(ANumber); - тут Вы пытаетесь удалить число равное индексу, при этом странно что пытаетесь Вы удалить, когда числа не равны
                    
                }
                else
                {
                    // Debug.Log("Оставляем элемент!");
                    result.Remove(a[ANumber]);
                }
            }
        }
        return result.ToArray();
    }
}
public class Test : MonoBehaviour
{
    void Start()
    {
        int[] array = Kata.ArrayDiff(new int[] { 2, 2, 1, 2 }, new int[] { 1 });
        foreach(int i in array)
        {
            Debug.Log( array[i] );
        }
    }
}
Answer 2

У вас тут перепутано:

// Debug.Log($"Удаляем элемент! номер элемента: {a[ANumber]}");
result.Remove(ANumber);

Как-раз таки номер элемента - это ANumber, а вот удалять надо - a[ANumber]:

// Debug.Log($"Удаляем элемент! номер элемента: {ANumber}");
result.Remove(a[ANumber]);

P.S. И да, Evgenii Izhboldin прав, что переместил удаление в else - вы ещё и по смыслу не то делаете, что у вас написано. Определитесь - вам надо оставить одинаковые элементы или разные. По описанию и названию функции у вас должна остаться разница между массивами, а результат вы хотите обратный судя по приведённым данным - оставить одинаковые элементы. Непонятно.

READ ALSO
Добавление введеных переменных в стек

Добавление введеных переменных в стек

Нужно создать стек в котором хранится ссылка на тип ISolid - объект класса

144
Не обнаруживаются ошибки в Atom C#

Не обнаруживаются ошибки в Atom C#

Скачал Atom, поставил: language-csharp, ide-csharp, linter, но ошибки по прежнему не подсвечиваютсяЕсть ли пакет нужный для шарпа? Вот скрины, что ошибки нет

120
Как присвоить результат делегата переменной в методе?

Как присвоить результат делегата переменной в методе?

Формулировка вопроса возможно размытая, поэтому вот моя цель:

128
Docker и asp.net core 3.1 + angular application

Docker и asp.net core 3.1 + angular application

Пытаюсь впервые развернуть приложение в докереПри создании приложения выбрал шаблон Angular application

175