处理 IEnumerable 多重枚举的危险
在使用 IEnumerable 集合时,开发人员经常会遇到警告“Possible multiple enumeration of IEnumerable” ,”当集合被迭代多次时就会出现。这个问题可能会产生问题,特别是在处理某些类型的集合时,例如代表数据库查询或其他昂贵操作的集合。
考虑以下代码片段:
public List<object> Foo(IEnumerable<object> objects) { if (objects == null || !objects.Any()) throw new ArgumentException(); var firstObject = objects.First(); var list = DoSomeThing(firstObject); var secondList = DoSomeThingElse(objects); list.AddRange(secondList); return list; }
一种方法避免多重枚举警告的方法是修改方法参数以接受List
另一种选择是在方法开头将 IEnumerable 转换为 List:
public List<object> Foo(IEnumerable<object> objects) { var objectList = objects.ToList(); // ... }
虽然这种技术可以有效地防止警告,但它可能会让人感到尴尬和不必要的冗长。
理解的关键这个问题在于方法签名所传达的语义。传递 IEnumerable 参数意味着调用者预计该方法仅枚举该集合一次。通过接受 IList 或 ICollection,您可以向调用者明确传达您对集合的期望,从而减少误解和代价高昂的错误的风险。
在必须使用 IEnumerable 的情况下,建议执行 ToList( ) 转换在方法的开头。这可以确保后续迭代不会遇到多重枚举警告。
不幸的是,.NET 没有提供一个接口来封装 IEnumerable、Count 和索引器的功能,而无需添加或删除方法。这样的界面将大大简化这个问题,并提供更清晰、更简洁的解决方案。
以上是如何避免 C# 中的'可能的 IEnumerable 多重枚举”警告?的详细内容。更多信息请关注PHP中文网其他相关文章!