Сравните массив params объектов

avatar
Héctor Manuel Martínez Durán
8 апреля 2018 в 06:05
100
2
0

Я работаю над методом, который сравнивает набор объектов (поскольку объект поддерживает все типы), если они все одинаковые, он возвращает true, но если один или несколько различаются, он возвращает false.

Вот что у меня есть:

    public static bool Compare(bool compareTypes = false, params object[] values)
    {
        if (!compareTypes)
        {
            if (values is null || values.Length == 0) return false;
            else if (values.Length == 1) return true;
            else return values[0] == values[1];
        }
        else
        {
            if (values is null || values.Length == 0) return false;
            else if (values.Length == 1) return true;
            else return values[0].GetType() == values[1].GetType();
        }
    }

И это работает нормально, пока количество объектов равно 2.

Моя проблема в том, что я хочу, чтобы метод сравнивал значение или тип всех передаваемых параметров независимо от суммы

Это то, что я хочу, чтобы мой метод делал

Compare (false, "Hello", "Hello") //True
Compare(false, "Hello", "Bye") //False
Compare(true, 0, 1) //True
Compare(true, "Hi", 20) //False
Compare(false, "LOL", "LOL", "LOL", "LOL") //True
Compare(false, "LOL", "LOL", "LOL", "lol") //False
Источник
Gilad Green
8 апреля 2018 в 06:09
1

Я думаю, что есть место для улучшения дизайна того, над чем вы работаете. Каков больший масштаб того, что вы делаете? Почему передача всех элементов таким образом в object[] — это то, что вы решили сделать.

Héctor Manuel Martínez Durán
8 апреля 2018 в 06:11
0

@GiladGreen Рад слышать

Tadija Bagarić
8 апреля 2018 в 06:12
3

Вы могли бы облегчить себе жизнь, создав 2 метода: CompareValue и CompareType вместо того, чтобы выполнять эту логику if else внутри одного метода.

user3559349
8 апреля 2018 в 06:17
1

используя linq, вы можете использовать values.Count() == values.Distinct().Count();

Ответы (2)

avatar
Tadija Bagarić
8 апреля 2018 в 06:18
1

Если вас устраивает логика, которая работает для двух объектов, почему бы просто не сравнить все объекты таким же образом с помощью цикла?

public static bool Compare(bool compareTypes = false, params object[] values)
{
    if (!compareTypes)
    {
        if (values == null || values.Length == 0)
        {
            return false;
        }
        else if (values.Length == 1)
        {
            return true;
        }
        else if (values.Length == 2){
            return values[0] == values[1];
        }
        else 
        {
            bool result = true;
            for(int i = 0; i < values.Length - 1; i++)
            {
                if(values[i] != values[i+1])
                {
                    result = false;
                    break;
                }
            }
            return result;
        }
    }
    else
    {
        if (values == null || values.Length == 0)
        {
            return false;
        }
        else if (values.Length == 1)
        {
            return true;
        }
        else if (values.Length == 2)
        {
            return values[0].GetType() == values[1].GetType();
        }
        else 
        {
            bool result = true;
            for(int i = 0; i < values.Length - 1; i++)
            {
                if(values[i].GetType() != values[i+1].GetType())
                {
                    result = false;
                    break;
                }
            }
            return result;
        }
    }
}

Вот рабочий пример с вашими тестами: https://dotnetfiddle.net/uDA5Mb

Héctor Manuel Martínez Durán
8 апреля 2018 в 06:23
0

Ваш код полон ошибок, так как не все пути возвращают несуществующее значение и свойства

Tadija Bagarić
8 апреля 2018 в 06:26
0

Я чувствую предупреждение IDE в этом комментарии - они не идеальны. Все пути в этом коде возвращают логическое значение. Код - это просто ваша логика для 2 объектов, примененных к массиву объектов.

Héctor Manuel Martínez Durán
8 апреля 2018 в 06:39
0

Что ж, после некоторых модификаций ваш код работает как положено

Tadija Bagarić
8 апреля 2018 в 06:39
0

Были некоторые орфографические ошибки, которые я исправил. Я также добавил работающий пример, посмотрите здесь: dotnetfiddle.net/uDA5Mb

avatar
Max Winner
8 апреля 2018 в 07:12
0

Вы также можете использовать рекурсию и таким образом упростить свой код.

    public static bool Compare(bool compareTypes = false, params object[] values)
    {
        if (values is null || values.Length == 0)
            return false;
        else if (values.Length == 1)
            return true;
        else if (values.Lenght == 2)
            if (!compareTypes)
                return values[0] == values[1];
            else
                return values[0].GetType() == values[1].GetType();
        else
        {
            for(int i = 0; i < values.Lenght - 1; i++)
               if(!Compare(compareTypes, values[i], values[i+1]))
                    return false;
            return true;
        }
    } 

Очень просто.