c# linq可能的多重枚举最佳实践
本文关键字:枚举 最佳 linq | 更新日期: 2023-09-27 18:04:16
我有时在c#源代码中使用LINQ结构。我使用VS 2010与ReSharper。现在我从ReSharper得到"IEnumerable的可能的多个枚举"的警告。
我想根据最佳实践重构它。下面简单介绍一下它的作用:
IEnumerable<String> codesMatching = from c in codes where conditions select c;
String theCode = null;
if (codesMatching.Any())
{
theCode = codesMatching.First();
}
if ((theCode == null) || (codesMatching.Count() != 1))
{
throw new Exception("Matching code either not found or is not unique.");
}
// OK - do something with theCode.
一个问题:我应该首先将LINQ表达式的结果存储在一个列表中吗?(我很确定它不会返回超过几行-最多10行。)
感谢任何提示。
谢谢帕维尔
由于您想要验证您的条件是否唯一,您可以尝试以下操作(是的,您必须存储结果):
var codes = (from c in codes where conditions select c).Take(2).ToArray();
if (codes.Length != 1)
{
throw new Exception("Matching code either not found or is not unique.");
}
var code = codes[0];
是的,您需要将结果存储为List'Array,然后使用它。在这种情况下,它不会枚举它几次。
在你的情况下,如果你需要确保只有一个项目满足条件,你可以使用Single
-如果有多个项目满足条件,它将抛出异常。如果没有任何项,也会抛出异常。
和你的代码将更容易:
string theCode = (from c in codes where conditions select c).Single();
但是在这种情况下,你不能改变异常文本,或者你需要把它包装到自己的try'catch块中,然后用自定义文本'exception
用.ToList()
/.ToArray()
结束enumerable可以消除警告,但是要理解它是否比多个枚举更好取决于codes
和conditions
的实现。.Any()
和.First()
是惰性原语,不会在第一个元素之后执行,.Count()
可能根本不会被执行,因此转换为列表可能比获取新的枚举数更浪费。