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