메소드에서 정렬 된 항목 목록을 반환하고 싶습니다. 내 반환 형식 IEnumerable 또는 IList 수해야합니까?IEnumerable 또는 IList를 반환해야합니까?
답변
여기에 계층 구조가 있습니다 :
interface IList<T> : ICollection<T> { }
interface ICollection<T> : IEnumerable<T> { }
당신은 최소한의 커플 링을 목표로, 그래서 충분 경우 IEnumerable<T>
을 반환하려면이. 그것은 아마있을 것입니다.
발신자가 추가/삽입/제거에 사용할 수있는 목록을 가져야하는 상황이 발생하면 IList<T>
을 반환하십시오. 그러나 호출자가 IEnumerable 컬렉션에서 자신의 List를 만든 경우에도 더 좋을 수 있습니다.
IEnumerable을 사용할 때 ElementAt 및 Count 함수는 어떻게됩니까? ElementAt를 호출 할 때마다 반복문은 요소를 찾을 때까지 전체 목록을 통과합니다. 이것은 전체 목록에서 루프를 제외하고 Count를 사용하는 동일한 동작입니다. 이것은 추가, 제거 및 삽입 외에 목록을 사용하는 데 고려해야합니다. 내가 잘못? – Samuel
죄송 합니다만 가능한 커플 링을 확장 할 수 있습니까? IList
생산 끝에서 IEnumerable 만 반환하면 나중에 다른 라이터 구현을 선택하게됩니다. 소비가 끝나면 더 중요합니다. –
IEnumerable은 IList보다 덜 구체적입니다. 즉, IList에는 IEnumerable에서 제공하지 않는 함수가 있습니다.
두 기능을 비교하여 다른 기능이 필요없는 기능이 있는지 확인하십시오.
정렬 된 목록을 반환하려면 SortedList를 반환해야합니다.
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
당신은 개체와 주문을 연결할 수 있습니다.
IList에는 항목 (예 : 추가)을 변경하는 방법이 있습니다. ICollection과 IEnumerable 사이에서 선택하려고 할 수 있습니다.
ICollection은 IEnumerable을 확장하고 유용 할 Count 속성을 사용할 수 있습니다.
간편한 발신자가 Readonly 만 사용해야하는 경우에는 IEnumerable을 사용하십시오. 이것은 공분산 (결과는 기본 유형으로 변환 될 수 있습니다)을 지원합니다.
그것은 사실 공변이지만 중요한 점입니다. –
재미있는 포인트 공분산 – Ben
IOBeredableEnumerable
일반적으로 발신자에게 필요한 모든 것이있는 한 IEnumerable<T>
을 반환하는 것이 좋습니다.
IEnumerable<T>
은 foreachable이며 많은 소비자에게 필요한 전부입니다. 읽기 전용이기도합니다. 이는 흔히 당신에게 말하지 않고 누군가를 수정하는 것에 대해 너무 걱정하지 않고 실제 백업 컬렉션을 반환하여 최적화 할 수 있음을 의미합니다.
그러나 소비자가 IEnumerable<T>
에없는 방법을 필요로하면 IList<T>
이 더 적합 할 수 있습니다. 예를 들어 발신자는 Contains
으로 전화 할 수도 있습니다.이 번호는 IEnumerable<T>
이 아닙니다. 또는 호출자가 처음부터 끝까지 반복하지 않고 목록에 색인을 생성 할 수 있습니다.
하지만 LINQ의 Contains 및 ElementAt 확장 방법을 통해 IEnumerable<T>
에도 포함 및 색인 생성을 수행 할 수 있습니다. 여기서 학위 문제가 있습니다. 발신자가 IEnumerable<T>
에서 사용할 수없는 질문 하나 (예 : "is this empty")를 묻는 경우 IEnumerable<T>
을 반환하고 Any 확장 방법을 사용합니다. 그러나 발신자가 IList<T>
작업을 광범위하게 사용하는 경우 IList<T>
을 반환하십시오.
LINQ 버전의 Contains 및 ElementAt를 사용하면 성능 문제가 발생할 수 있으므로 foreach를 발생시키는 후드에서 발생하므로 항상 O (n)이됩니다. IList Contains 또는 ElementAt의 구현에 따라 O (1) 연산이 될 수 있습니다. – Oliver
@ 올리버, "항상"이라고 말하는 것은 잘못입니다. LINQ Contains와 ElementAt는 컬렉션을'ICollection
정보를 제공해 주셔서 감사 드리며, 아직 배워야 할 새로운 내용이 있습니다. ;-) – Oliver
결과에 따라 원하는 결과가 결정됩니다. 항목 수를 얻거나 개별 항목에 임의로 액세스해야하는 경우 IList로 이동하십시오.
발신자가 바로 항목을 반복 할 경우는 IEnumerable과 함께 할 것입니다 - 을하지만 반환 값이 느리게 여부를 평가할지 여부를 문서화해야합니다 - 많은 IEnumerable을 경우 이러한 일이 실행됩니다 쿼리를 나타낼 때 컬렉션이 열거됩니다. 당신이 돌아 오는 것이 수요에 따라 평가되지 않는다면, 나는 IList와 함께 갈 것입니다.
+1 문서 강조. –
+1 첫 문장. 이 답변을 읽기 전에 아래에 의견을 적었습니다. – Samuel
- 1. ArrayList 또는 IList를 사용해야합니까?
- 2. 참조 또는 해시를 반환해야합니까?
- 3. 함수가 참조 또는 객체를 반환해야합니까?
- 4. IList를 반복합니다.
- 5. 내 DAL에서 IEnumerable <T> 또는 IQueryable <T>을 반환해야합니까?
- 6. Perl 생성자가 undef 또는 "invalid"객체를 반환해야합니까?
- 7. Silverlight에서 IList를 사용하는 방법
- 8. LLBLGen 엔터티의 IList를 반환하는 Silverlight WCF 액세스?
- 9. 배열이 IList를 지원하는 이유는 무엇입니까?
- 10. 비즈니스 계층 (또는 서비스 계층, 도메인 모델 등)에서 BindingList를 반환해야합니까?
- 11. * shared_ptr을 사용하여 * this를 반환해야합니까?
- 12. MVC 작업이 actionResult를 반환해야합니까?
- 13. IEnumerable 또는 array를 포함하는 제약 조건, 인터페이스 또는 클래스가 있습니까?
- 14. 루핑 IEnumerable
- 15. API java 5 이상 : 배열 또는 컬렉션을 반환해야합니까?
- 16. NSCopying 및 copyWithZone : - [self retain] 또는 다른 것을 반환해야합니까?
- 17. WCF 서비스가 EntityObject 또는 POCO/DTO 클래스를 반환해야합니까?
- 18. 레코드가없는 Db로드가 끝나면 Collection은 null 또는 빈을 반환해야합니까?
- 19. WCF 서비스는 일반 오래된 개체 또는 작업중인 실제 클래스를 반환해야합니까?
- 20. 새로운 Razor View Engine을 사용하면 HtmlHelpers가 문자열 또는 IHtmlString을 반환해야합니까?
- 21. 서비스 계층 또는 거의 모든 방법에서 무엇을 반환해야합니까?
- 22. None 대신 빈 dict을 반환해야합니까?
- 23. EF 4.0 리포지토리 패턴 IList <T> 또는 IEnumerable <T>
- 24. 캐싱 IEnumerable
- 25. IEnumerable & IEnumerator
- 26. PHP 함수가 모든 값을 반환해야합니까?
- 27. 서비스 레이어에서 무엇을 반환해야합니까? DotNetOpenAuth
- 28. 대리자 메서드에서 NSError 개체를 반환해야합니까?
- 29. ASP MVC : 서비스에서 IQueryable을 반환해야합니까?
- 30. 정말 빈 문자열()을 반환해야합니까?
나는 아직 답을 확신 할 수 없다. 현재의 사고 - 모든 IEnumerable의 요소 보증 순서가 아니므로 IList에 기대고 있습니다. – Ben
벤, 어떻게 작동하지 않습니다. 당신은 이미 어떤 것을 주문했는데 (List), IEnumerable로 노출시킨다. 해당 인터페이스는 주문을 변경할 수 없습니다 (변경할 수 없음). 수신하는쪽에 필요한 것을 살펴보고 가장 작은 옵션을 선택하십시오. –
@Henk - 감사합니다. 인터페이스에 메서드가 있고 결과 값이 정렬되지 않는다면 IList 또는 유사하게 제안 할 것입니까? – Ben