如何有效地比较C#中的两组字符串?

如何有效地比较C#中的两组字符串?,c#,if-statement,exception,C#,If Statement,Exception,我有两个变量(基本上每个变量有四个=>old/current)。 它们都可以是“ABCDXFG”或“:ABCDXFG”(基本上是级别名称),也可以是“hub” 如果级别名称不相等,我有一个if-else语句返回true,但是我需要hub的异常(即使现在也很长)加上另外4个级别 if (current.LevelSecond != old.LevelSecond && current.LevelSecond != old.LevelFirst &&

我有两个变量(基本上每个变量有四个=>old/current)。 它们都可以是“ABCDXFG”或“:ABCDXFG”(基本上是级别名称),也可以是“hub”

如果级别名称不相等,我有一个if-else语句返回true,但是我需要hub的异常(即使现在也很长)加上另外4个级别

if (current.LevelSecond != old.LevelSecond && 
    current.LevelSecond != old.LevelFirst && 
    current.LevelFirst != "HUB" && 
    old.LevelFirst != "HUB" && 
    current.LevelSecond != "HUB" && 
    old.LevelSecond != "HUB")
        return true;

else if (current.LevelFirst == "HUB" || 
         old.LevelFirst == "HUB" || 
         current.LevelSecond == "HUB" || 
         old.LevelSecond == "HUB")
            return false;
这看起来很恶心,而且因为我没有经验,我不知道如何使这尽可能有效。如果我加上这四个级别,语句的长度将是原来的四倍


请帮忙(

一种可能是将此检测功能的一部分推送到您的类中,这将简化您当前编写的代码,如果在其他地方重复使用,则可能会减少其他代码:

class Item
{
    public const string Hub = "HUB";
    public string LevelFirst { get; set; }
    public string LevelSecond { get; set; }

    public bool HasCommonLevelWith(Item other)
    {
        if (other == null || ContainsAHub() || other.ContainsAHub())
        {
            return false;
        }

        return
            LevelFirst.Equals(other.LevelFirst, StringComparison.OrdinalIgnoreCase) ||
            LevelSecond.Equals(other.LevelSecond, StringComparison.OrdinalIgnoreCase);
    }

    public bool ContainsAHub()
    {
        return LevelFirst.Equals(Hub, StringComparison.OrdinalIgnoreCase) ||
               LevelSecond.Equals(Hub, StringComparison.OrdinalIgnoreCase);
    }
}
那么,您前面编写的代码看起来就像:

return current.HasCommonLevelWith(old);

以下是一种方法,您可以使用一组简单的数据结构来保存旧的当前的级别值:

class Level
{
    public string Current { get; set; }
    public string Old { get; set; }
}

class Program
{

    static bool CompareLevels(ICollection<Level> levels)
    {
        foreach (var item in levels)
        {
            // Either of any level is HUB => false
            if ((item.Current == "HUB") || (item.Old == "HUB"))
                return false;

            // Any Old level == any Current level => false
            if (levels.Any(level => level.Old == item.Current))
                return false;
        }

        // All levels met the criteria (no exceptions/failures)
        return true;
    }


    // A simple console program to exercise the above function:

    static void Main(string[] args)
    {
        // Should return false if any Old or Current levels are HUB
        var levels = new List<Level>
        {
            new Level { Current = "HUB", Old = "ABCDEF" },
            new Level { Current = "DEFGHI", Old = "HUB" }
        };
        Console.WriteLine(CompareLevels(levels));

        // Should return true if all Old levels != any Current level and none are "HUB"
        levels = new List<Level>
        {
            new Level { Current = "ABC123", Old = "ABCDEF" },
            new Level { Current = "DEFGHI", Old = "DEF456" }
        };
        Console.WriteLine(CompareLevels(levels));

        // Should return false if any Old level == any Current level
        levels = new List<Level>
        {
            new Level { Current = "ABC123", Old = "ABCDEF" },
            new Level { Current = "DEFGHI", Old = "ABC123" }
        };
        Console.WriteLine(CompareLevels(levels));

        Console.ReadLine();
    }
}
类级别
{
当前公共字符串{get;set;}
公共字符串Old{get;set;}
}
班级计划
{
静态布尔比较器电平(I采集电平)
{
foreach(级别中的var项目)
{
//任何级别中的任何一个都是HUB=>false
如果((item.Current==“HUB”)| |(item.Old==“HUB”))
返回false;
//任何旧级别==任何当前级别=>false
if(levels.Any(level=>level.Old==item.Current))
返回false;
}
//所有级别均符合标准(无异常/故障)
返回true;
}
//执行上述功能的简单控制台程序:
静态void Main(字符串[]参数)
{
//如果任何旧的或当前的级别被禁用,则应返回false
变量级别=新列表
{
新级别{Current=“HUB”,Old=“ABCDEF”},
新级别{Current=“DEFGHI”,Old=“HUB”}
};
控制台写入线(比较级别(级别));
//如果所有旧级别!=任何当前级别,且没有一个级别为“中心”,则应返回true
级别=新列表
{
新级别{Current=“ABC123”,Old=“ABCDEF”},
新级别{Current=“DEFGHI”,Old=“DEF456”}
};
控制台写入线(比较级别(级别));
//如果任何旧级别==任何当前级别,则应返回false
级别=新列表
{
新级别{Current=“ABC123”,Old=“ABCDEF”},
新级别{Current=“DEFGHI”,Old=“ABC123”}
};
控制台写入线(比较级别(级别));
Console.ReadLine();
}
}
级别集合的迭代将在第一个失败条件下终止,因此不会在整个集合上进行浪费性的迭代。集合完全枚举的唯一条件是没有失败

这可能不是最有效的方法,但此处的优化对于所涉及的级别数来说将是非常小的。它还要求您初始化一个集合以保存要比较的级别

然而,它的优点是可以容纳任意数量的“级别”和(imho),使比较标准非常清晰且易于理解


注意:在C#中使用
=
比较字符串值没有问题,除非需要考虑区域性和大小写变化等。
=
对于字符串,将比较所涉及字符串的值。

这是Java还是C#?我假设C#因为在标题中,您不需要“else”这个词-因此,将其缩短一位将括号{}放入if-else语句和checkfirst将“HUB”存储为常量字符串作为开始是一个非常好的主意。如果将第二个条件放在第一个条件的前面,则可以从第一个条件中删除“HUB”检查。