"IEnumerable의 가능한 다중 열거"를 설명하는 Resharper의 예제 코드
때때로 Resharper는 다음에 대해 경고합니다.
IEnumerable의 가능한 다중 열거
거기에 이 문제를 처리하는 방법에 대한 SO 질문은 , 그리고 ReSharper에서 사이트도 일을 설명하고 여기에 . 대신이 작업을 수행하도록 지시하는 샘플 코드가 있습니다.
IEnumerable<string> names = GetNames().ToList();
내 질문은이 특정 제안에 관한 것입니다. 여전히 2 개의 for-each 루프에서 컬렉션을 두 번 열거하지 않을까요?
GetNames()
를 반환합니다 IEnumerable
. 따라서 그 결과를 저장하면 :
IEnumerable foo = GetNames();
그런 다음 열거 모든 시간 foo
의 GetNames()
방법을 다시 호출 (문자 그대로, 내가 제대로은 세부 사항을 설명하는 링크를 찾을 수 있지만 볼 수 없습니다 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()
'programing' 카테고리의 다른 글
포커스가있는 HTML 페이지 요소를 확인하는 방법은 무엇입니까? (0) | 2020.11.17 |
---|---|
PHP> = 5.3 엄격 모드에서 오류를 생성하지 않고 객체에 속성을 추가하는 방법 (0) | 2020.11.16 |
ui-router 및 Angularjs를 사용하여 TOP으로 자동 스크롤 (0) | 2020.11.16 |
Python 생성기에서 한 요소 (peek)를 미리 보는 방법은 무엇입니까? (0) | 2020.11.16 |
즉시 다시 발생하지 않으면 예외 추적이 숨겨집니다. (0) | 2020.11.16 |