假设我有3个char
变量:a
、b
和c
。
每个字符都可以是'0'
,这是一个特例,这意味着它匹配每个字符。
所以如果a是'0'
,我只需要检查b == c
。
我想检查一下a == b == c
,但发现C#中的实现变得混乱和冗长。
你能提供什么有创意的或漂亮的解决方案吗?
更新
对于性能驱动,采用Erik A. Brandstadmoen的方法。为了简单起见,我使用了M4N的apprach,我还做了一些修改:!(query.Any() && query.Distinct().Skip(1).Any())
发布于 2011-08-11 04:07:33
下面的代码应该适用于任意数量的char值:
public class Comparer
{
public static bool AreEqualOrZero(params char[] values)
{
var firstNonZero = values.FirstOrDefault(x => x != '0');
return values.All(x => x == firstNonZero || x == '0');
}
}
通过以下单元测试:
[TestClass()]
public class ComparerTest
{
[TestMethod()]
public void Matches_With_Wildcard()
{
char[] values = {'0', '1', '1', '1'};
Assert.IsTrue(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Matches_With_No_Wildcard()
{
char[] values = {'1', '1', '1', '1'};
Assert.IsTrue(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Matches_With_Only_Wildcards()
{
char[] values = {'0', '0', '0'};
Assert.IsTrue(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Matches_With_Zero_Length()
{
char[] values = {};
Assert.IsTrue(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Matches_With_One_Element()
{
char[] values = {'9'};
Assert.IsTrue(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Matches_With_One_Wildcard_And_Nothing_Else()
{
char[] values = {'0'};
Assert.IsTrue(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Does_Not_Match_On_NonEqual_Sequence_No_Wildcard()
{
char[] values = {'1', '2', '1', '1'};
Assert.IsFalse(Comparer.AreEqualOrZero(values));
}
[TestMethod()]
public void Does_Not_Match_On_NonEqual_Sequence_With_Wildcard()
{
char[] values = {'1', '2', '1', '0'};
Assert.IsFalse(Comparer.AreEqualOrZero(values));
}
}
发布于 2011-08-11 03:51:41
这算不算混乱和冗长?
对我来说似乎没问题,前提是你只能拥有这三个人...
return ((a == "0" || b == "0" || a == b) && (b =="0" || c =="0" || b == c) && (a =="0" || c =="0" || a == c));
发布于 2011-08-11 03:54:48
bool MatchTwo(char a, char b)
{
return a == '0' || b == '0' || a == b;
}
bool MatchThree(char a, char b, char c)
{
return MatchTwo(a, b) && MatchTwo(a, c) && MatchTwo(b, c);
}
我不确定我是否可以称之为优雅,但它并不可怕(甚至可能是正确的……)(请注意,这或多或少是对上面帕迪答案的改进)。
https://stackoverflow.com/questions/7016836
复制相似问题