我有一个关于何时使用Exception或If / Else语句的问题。
在我的情况下,我想检查DocumentNode是否为TestNode。当它是一个TestNode时,我想获取该节点。

我在下面为此编写了两种可能的解决方案。第一个解决方案认为这是一个TestNode,否则给出Exception。第二种解决方案
检查它是否为TestNode,然后执行大致相同的功能以获取该节点。谁能告诉我什么是最好的解决方案?还是在那里
一个更好的解决方案?谢谢,彼得。

*对不起,我的英语不好..

private DocumentNode GetTestNode(IEnumerable<DocumentNode> nodes)
{
    foreach (DocumentNode node in nodes)
    {
        if (node.GetValueProperty().ToString() == "TestValue")
        {
            return node;
        }
    }
    throw new TestNodeNotFoundException("This is not a TestNode");
}

OR:

private DocumentNode IsTestNode(IEnumerable<DocumentNode> nodes)
{
    foreach (DocumentNode node in nodes)
    {
        if (node.GetValueProperty().ToString() == "TestValue")
        {
            return true;
        }
    }
    return false;
}

private DocumentNode GetTestNode(IEnumerable<DocumentNode> nodes)
{
    foreach (DocumentNode node in nodes)
    {
        if (node.GetValueProperty().ToString() == "TestValue")
        {
            return node;
        }
    }
}

最佳答案

如果可以的话,更好的解决方案是使用LINQ。如果要例外,可以使用:

var node = nodes.Where(n => node.GetPropertyValue().ToString() == "TestValue")
                .First();


(如果应该只有一个这样的节点,也可以使用Single。)

如果您不希望出现异常,请改用FirstOrDefault

var node = nodes.Where(n => node.GetPropertyValue().ToString() == "TestValue")
                .FirstOrDefault();


如果没有TestValue节点,则node将为null。

要测试是否存在测试节点,请使用Any

var isTest = nodes.Where(n => node.GetPropertyValue().ToString() == "TestValue")
                  .Any();


(您的最终方法目前无法编译,因为它可以到达末尾而无需返回。)

哪种方法确实取决于您要执行的操作。如果缺少测试节点表明存在错误,则抛出异常是适当的。如果不是,请使用null发出信号,这很合理,或者可以使用TryXXX模式显式返回bool值,同时将找到的节点(如果有)保存在out参数中。

09-26 20:06