2011-10-06 31 views
5

我一直在使用try/catch语句来运行通过它时是否存在元素。显然这不是做这件事的最好方法。我一直在使用LINQ(lambda表达式)进行大部分解析,但我不知道如何检测元素是否存在。如何在c#中使用lambda表达式检测元素是否存在?

我发现的一些解决方案的一个大问题是,它们比使用try/catch块多了3-4倍的代码,这种方式无法达到目的。

我将承担的代码会是这个样子:

if(document.Element("myElement").Exists()) 
{ 
    var myValue = document.Element("myElement").Value; 
} 

我也觉得这link,但循环是在我的情况下不必要的,因为我可以保证,它只会出现一次,如果它存在。另外还需要创建一个似乎不必要的虚拟元素。看起来这不是检查的最佳方式(或一种好方法)。有任何想法吗?

+0

'try' /'catch'块可能会非常慢。应该尽可能地避免它们。 – Enigmativity

回答

0

Any()是Linq命令。

Assert.IsFalse(new [] { 1, 2, 3, 4 }.Any(i => i == 5)); 
-1

Any()是检查元素是否存在的最简单方法。

如果您必须确保元素是唯一的,那么您必须执行一些操作,如.Count() == 1。或者,你可以实现你自己的扩展方法,但这只是一个围绕.Count == 1的包装。

0

顺便说一句,上面关于“try/catch”的评论可以是是真的,但几乎不是所有情况。这取决于您如何构建解决方案。在您的发布版本中,尽可能关闭尽可能多的标志,即使远处也有“调试”的味道。在构建过程中,运行时间被记忆为堆栈轨迹和东西的时间越少,“try/catch”就越快。

顺便说一句,#2:着名的建筑模式“告诉,不要问!” (TDA)和“Open Close Principle”(OCP)禁止使用这样的臭名昭着的代码,如“if(!(fp = fopen(...))”,他们不仅鼓励你使用“try/catch“,但是强迫你这样做,因为OCP不仅要求遵守你自己的代码,而且还要在调用外部东西(即stdio等库)时使用OCP。你不能扩大现有代码的含义,坚持简单的“打开”的例子,当结果为零时,你会怎么做?为什么“打开”失败?你可以检查是否有足够的空间或者文件系统是可写的,如果文件名是有效的,或者不是,你的目标是无法实现的:打开文件,想象一下无头应用程序,所以用户不需要干预。那里 是没有理由进一步摸索的东西,因为“打开”失败。你需要一个回退策略。点。如果“打开”失败,则失败。

经验法则:认为你的代码总是成功(KIS)。如果你的代码愿意可能'失败'的结果集定期可能包含元素或不,将逻辑放入类。也许你必须分布不同类别(TDA)的数据,属性,问题和方法。也许你必须根据SLA重新调整你的代码。

尽管如此,请确保元素已存在。如果你不能,那不是你的错。在代码的深处(一个封装器,前编码器的所有错误都被美化了),将需要的数据转换成另一个实体,这样进一步就不需要“如果”。

+0

返回null的代码是后续代码。检查您自己的作用域中的值是否与违反TDA或OCP无关。 –

相关问题