首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当3个变量中的任何一个都可以是通配符时,检查3个变量是否相等的优雅方法是什么?

当3个变量中的任何一个都可以是通配符时,检查3个变量是否相等的优雅方法是什么?
EN

Stack Overflow用户
提问于 2011-08-11 03:47:32
回答 7查看 7.5K关注 0票数 17

假设我有3个char变量:abc

每个字符都可以是'0',这是一个特例,这意味着它匹配每个字符。

所以如果a是'0',我只需要检查b == c

我想检查一下a == b == c,但发现C#中的实现变得混乱和冗长。

你能提供什么有创意的或漂亮的解决方案吗?

更新

对于性能驱动,采用Erik A. Brandstadmoen的方法。为了简单起见,我使用了M4N的apprach,我还做了一些修改:!(query.Any() && query.Distinct().Skip(1).Any())

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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));
    }
}
票数 2
EN

Stack Overflow用户

发布于 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));
票数 2
EN

Stack Overflow用户

发布于 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);
}

我不确定我是否可以称之为优雅,但它并不可怕(甚至可能是正确的……)(请注意,这或多或少是对上面帕迪答案的改进)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7016836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档