有时我在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行。)

任何提示表示赞赏。

谢谢
帕维尔

最佳答案

是的,您需要将结果存储为List \ Array,然后使用它。在这种情况下,它将不会枚举两次。

在您的情况下,如果您需要确保只有一个满足条件的项目,则可以使用Single-如果存在多个满足条件的项目,则会抛出异常。如果根本没有任何项目,它也会引发异常。

而且您的代码将更容易:

string theCode = (from c in codes where conditions select c).Single();


但是在这种情况下,您无法更改异常文本,或者需要将其包装到自己的try \ catch块中,然后使用自定义文本\ exception将其重新抛出

10-05 18:12