【问题标题】:Compare params array of objects比较对象的参数数组
【发布时间】:2018-04-08 06:05:08
【问题描述】:

我正在研究一种比较对象集合的方法(因为对象支持所有类型),如果它们都相同,则返回 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

【问题讨论】:

  • 我认为有地方可以改进您正在从事的工作的设计。您所做工作的更大范围是什么?为什么在object[] 中以这种方式传递所有项目是您决定要做的......
  • @GiladGreen 我很高兴听到
  • 您可以通过创建 2 个方法让您的生活更轻松:CompareValueCompareType,而不是在一个方法中执行 if else 逻辑拆分
  • 使用linq,你可以使用values.Count() == values.Distinct().Count();

标签: c# arrays object


【解决方案1】:

如果您对适用于 2 个对象的逻辑没问题,为什么不使用循环以相同的方式比较所有对象?

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

【讨论】:

  • 您的代码充满错误,因为并非所有路径都返回不存在的值和属性
  • 我在该评论中感觉到 IDE 警告 - 它们并不完美。此代码中的所有路径都返回一个布尔值。该代码只是您将 2 个对象应用于对象数组的逻辑
  • 好吧,经过一些修改,您的代码可以正常工作
  • 我修复了一些拼写错误。我还添加了一个可运行的示例,请看这里:dotnetfiddle.net/uDA5Mb
【解决方案2】:

您还可以使用递归并通过这种方式简化您的代码。

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

很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2013-05-17
    • 2022-01-11
    相关资源
    最近更新 更多