Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IEnumerable用于可能多次枚举的对象是否安全?_C#_Ienumerable_Enumeration - Fatal编程技术网

C# 将IEnumerable用于可能多次枚举的对象是否安全?

C# 将IEnumerable用于可能多次枚举的对象是否安全?,c#,ienumerable,enumeration,C#,Ienumerable,Enumeration,例如,假设我有以下内容: 公共类测线仪 { IEnumerable条件{get;} 公共StringTesterEnumerable条件句 { 条件句=条件句; } 公共bool testString testString { 条件中的foreach var条件 { if!conditional.testString { 返回false; } } 返回true; } } 这被认为是安全的,还是IEnumerable类型仅对单个枚举安全?如果不是,在这种情况下最好使用哪种类型?对于IEnumera

例如,假设我有以下内容:

公共类测线仪 { IEnumerable条件{get;} 公共StringTesterEnumerable条件句 { 条件句=条件句; } 公共bool testString testString { 条件中的foreach var条件 { if!conditional.testString { 返回false; } } 返回true; } } 这被认为是安全的,还是IEnumerable类型仅对单个枚举安全?如果不是,在这种情况下最好使用哪种类型?

对于IEnumerable在一般情况下是否可重复还没有定义。通常是这样的。然而,存在以下两种情况之一:

只能对套接字中的数据进行一次迭代 可以多次迭代,但每次给出完全不同的数据,没有任何相应的明显状态突变
所以:一般来说,我不建议重复多次,除非你知道这个场景是可重复的。如果数据发生变化,数组和列表之类的东西是可以重复的,当然,它们可能会改变以显示这些变化。

这应该是安全的,但可能不是最佳的。魔鬼在执行

IEnumerable调用GetEnumerator,它返回实现重置函数的IEnumerator

如何实现此功能可能会导致一些问题。如果您正在枚举一个调用Reset的数组,只需将其内部指针设置为-1,就可以再次枚举了


如果要枚举通过网络连接的内容,可能需要重新执行整个连接过程,然后再次查询数据。如果多次使用,数据将变得更长且次优。

我不确定您所说的安全是什么意思,但这种用法非常好。这取决于枚举。枚举是否可以安全地多次枚举不在类型中编码。即使在安全的地方,它通常也没有效率。如果需要强制实现可枚举项,可以在传入可枚举项时显式执行。ToList或在contract ICollection中强制实现。当然,您也会失去延迟枚举的能力,这可能是好的,也可能是坏的,具体取决于用例。IEnumerables从技术上讲可以多次枚举,但这通常是不可取的:枚举一个可能需要往返到数据库,或者,如果它是使用一长串Linq方法创建的,则可能会调用大量处理。通常最好避免多次枚举它们,尤其是当您不知道它们来自何处时。如果您要在字段中存储一个,您可能希望让消费者传递一些更具体的信息,比如说,一个IReadOnlyCollection或一个IReadOnlyList,这样可以避免不必要的错误copy@LeviH如果您已经从使用yield的方法创建了IEnumerable,然后第二次枚举IEnumerable将从一开始就有效地再次开始执行屈服方法。例如,如果该方法所做的第一件事是查询数据库,那么它将被查询again@LeviHC也一样。有IEnumerable和IEnumerator。使用IEnumerable创建IEnumerator调用其GetEnumerator方法。IEnumerator是具有当前属性和MoveNext方法的对象,它可以只向前遍历IEnumerable一次,而不需要经常重置它。但是,如果给定一个IEnumerable,则可以创建多个IEnumerator。