克服 IEnumerable 的多重枚举警告
在代码中使用 IEnumerable 时,开发人员经常面临“可能存在 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; }
在此示例中,objects 参数定义为 IEnumerable,允许调用者传递各种集合类型。但是,由于 IEnumerable 不保证单个枚举,因此多次访问它会触发警告。
要解决此问题,存在以下选项:
转换为 IList
将对象更改为 IList 或 ICollection 类型明确了传递的参数应该是一个集合的期望被枚举多次。此解决方案消除了警告,但缺点是要求调用者将标准 IEnumerable 显式转换为列表或集合。
在方法开始时转换
另一种方法是在方法开始时立即将 IEnumerable 转换为 List:
public List<object> Foo(IEnumerable<object> objects) { var objectList = objects.ToList(); // ... }
虽然这种方法解决了警告,它向代码添加了一个额外的步骤,并且可能会为潜在的大型集合引入不必要的开销。
建议的解决方案是设计方法来显式处理多个枚举。这可以通过将对象参数定义为结合了 IEnumerable、Count 和 Indexer 的接口来实现,而无需添加/删除方法。目前,.NET 中不存在这样的接口。
通过适应这些方法,开发人员可以有效管理与 IEnumerable 的多个枚举相关的警告,确保代码清晰和可预测的行为。
以上是如何有效解决'Possible Multiple Enumeration of IEnumerable”警告?的详细内容。更多信息请关注PHP中文网其他相关文章!