programing

"IEnumerable의 가능한 다중 열거"를 설명하는 Resharper의 예제 코드

nasanasas 2020. 11. 16. 21:37
반응형

"IEnumerable의 가능한 다중 열거"를 설명하는 Resharper의 예제 코드


때때로 Resharper는 다음에 대해 경고합니다.

IEnumerable의 가능한 다중 열거

거기에 이 문제를 처리하는 방법에 대한 SO 질문은 , 그리고 ReSharper에서 사이트도 일을 설명하고 여기에 . 대신이 작업을 수행하도록 지시하는 샘플 코드가 있습니다.

IEnumerable<string> names = GetNames().ToList();

내 질문은이 특정 제안에 관한 것입니다. 여전히 2 개의 for-each 루프에서 컬렉션을 두 번 열거하지 않을까요?


GetNames()를 반환합니다 IEnumerable. 따라서 그 결과를 저장하면 :

IEnumerable foo = GetNames();

그런 다음 열거 모든 시간 fooGetNames()방법을 다시 호출 (문자 그대로, 내가 제대로은 세부 사항을 설명하는 링크를 찾을 수 있지만 볼 수 없습니다 IEnumerable.GetEnumerator()).

Resharper는 이것을보고 열거 결과GetNames()지역 변수에 저장할 것을 제안합니다 ( 예 : 목록에 구체화).

IEnumerable fooEnumerated = GetNames().ToList();

이렇게하면을 참조하는 한 GetNames()결과가 한 번만 열거됩니다 fooEnumerated.

예를 들어 GetNames()(느린) 데이터베이스 호출을 수행 할 때와 같이 일반적으로 한 번만 열거하기를 원하기 때문에 이것은 중요 합니다.

결과를 목록으로 구체화 했기 때문에 fooEnumerated두 번 열거하는 것이 더 이상 중요하지 않습니다 . 메모리 내 목록을 두 번 반복하게됩니다.


나는 이것이 여러 열거를 이해하는 가장 쉽고 쉬운 방법을 발견했습니다.

C # LINQ : IEnumerable의 가능한 다중 열거

https://helloacm.com/c-linq-possible-multiple-enumeration-of-ienumerable-resharper/


GetNames()두 번 호출되지 않습니다. 의 구현은 IEnumerable.GetEnumerator()컬렉션을 열거 할 때마다 호출됩니다 foreach. 내 경우 IEnumerable.GetEnumerator()일부 비용이 계산되어이 고려해야 할 이유가 될 수 있습니다.


예, 의심 할 여지없이 두 번 열거 할 것입니다. 그러나 요점은 GetNames()계산하는 데 매우 비용이 많이 드는 게으른 linq 쿼리를 반환하면 또는 호출하지 않고 두 번 계산한다는 것 입니다.ToList()ToArray()

참고 URL : https://stackoverflow.com/questions/20129079/resharpers-example-code-for-explaining-possible-multiple-enumeration-of-ienume

반응형