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行。)

感谢任何提示。

谢谢帕维尔

c# linq可能的多重枚举最佳实践

由于您想要验证您的条件是否唯一,您可以尝试以下操作(是的,您必须存储结果):

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可以消除警告,但是要理解它是否比多个枚举更好取决于codesconditions的实现。.Any().First()是惰性原语,不会在第一个元素之后执行,.Count()可能根本不会被执行,因此转换为列表可能比获取新的枚举数更浪费。