>source

컬렉션을 사용하여 개체 수를 얻는 두 가지 방법이 있습니다.세다(재산) 및세다()(방법). 주요 차이점이 무엇인지 아는 사람이 있습니까?

틀릴 수도 있지만 항상세다내가 가정하고 있기 때문에 모든 조건문에서 속성세다()메서드는 컬렉션에 대해 일종의 쿼리를 수행합니다.세다내가 '받기' 전에 이미 할당되었을 것입니다. 그러나 그것은 추측입니다. 제가 틀렸다면 성능에 영향을 미칠지 모르겠습니다.

편집: 그렇다면 호기심에서세다()컬렉션이 null이면 예외를 throw합니까? 나는 꽤 확신하기 때문에세다속성은 단순히 0을 반환합니다.

둘 다 null 컬렉션에 대해 예외를 throw합니다. 둘 다 . 연산자가 null인 것에 대한 것입니다.

AaronLS2022-02-13 21:04:24
  • 답변 # 1

    세다()방법에 대한 최적화가 있습니다.ICollection< T> 그 결과세다속성이 호출됩니다. 이 경우 성능에는 큰 차이가 없을 수 있습니다.

    다음 이외의 유형이 있습니다.ICollection< T> 보다 효율적인 대안이 있습니다.세다()확장 방법이지만. 이 code 분석 성능 규칙은 다음 유형에서 실행됩니다.

    : Enumerable.Count 메서드 대신 Length/Count 속성 사용

    System.Array
    System.Collections.Immutable.ImmutableArray<T>System.Collections.ICollection
    System.Collections.Generic.ICollection<T>System.Collections.Generic.IReadOnlyCollection<T>

    따라서 우리는세다그리고길이속성을 사용할 수 있는 경우세다()그렇지 않으면 확장 방법.

  • 답변 # 2

    카운트()메소드는 각 요소를 반복하는 확장 메소드입니다.IEnumerable< >그리고 얼마나 많은 요소가 있는지를 반환합니다. 의 경우IEnumerable실제로목록< >, 그래서 그것은세다모든 요소를 ​​반복하는 대신 속성.

    List<>가 있는 경우에도 Count() 메서드를 사용하여 code를 보다 일반적으로 유지합니다. 특정 컬렉션 구현이 필요 없는 IEnumerable<>을 사용하도록 클래스를 리팩토링할 때 좋습니다.

    AntonioR2022-02-13 21:04:24
  • 답변 # 3

    성능은 둘 중 하나를 선택하는 이유 중 하나일 뿐입니다. 고르는.세다()code가 더 일반적임을 의미합니다. 더 이상 컬렉션을 생성하지 않는 일부 code를 리팩토링했지만 대신 IEnumerable과 같은 일반적인 code를 리팩토링했지만 다른 code는 다음에 의존했기 때문에 결과적으로 중단되었습니다..세다그리고 나는 그것을 변경해야했다.세다(). 내가 포인트를 사용했다면.세다()어디에서나 code는 더 재사용 가능하고 유지 관리가 쉬울 것입니다. 일반적으로 벗어날 수 있는 경우 보다 일반적인 인터페이스를 사용하는 것이 가장 좋습니다. 더 일반적이라는 말은 더 많은 유형으로 구현되는 더 간단한 인터페이스를 의미하므로 code 간 호환성이 향상됩니다.

    나는 말하지 않는다.세다()당신이 작성하는 code의 재사용 가능성을 더 많이 다루는 다른 고려 사항이 있다는 것을 말하는 것입니다.

    +1 토론에 귀중한 추가 사항. .Count 속성이 HtmlAgilityPack의 버전 업그레이드에서 살아남지 못했기 때문에 유지 관리 중인 일부 code가 손상되었습니다.

    Dan Solovay2022-02-13 21:04:24

    양날의 검이 아닐까 합니다. 언젠가 누군가가 IEnumerable을 진정한 생성기로 수정하려고 하면 어떻게 될까요? code베이스를 보면 .Count()가 열거 가능한 항목을 여러 번 반복할 수 있다고 가정하는 곳이 많이 있습니다.

    bashrc2022-02-13 21:04:24

    @bashrc 사실입니다. 개발자 code 변경 대 프레임워크 code 변경을 고려한다면 개발자 code가 변경될 가능성이 더 높다고 생각합니다. 프레임워크에서 그런 종류의 변경이 이루어지면 많은 것이 손상될 것입니다. 전통적으로 개발자가 원하는 대로 마이그레이션할 수 있도록 이러한 경우에 새로운 컬렉션/인터페이스를 도입합니다.

    AaronLS2022-02-13 21:04:24
  • 답변 # 4

    세다()메서드는 모든 작업에서 작동하는 LINQ 메서드입니다.IEnumerable< >. 당신은 기대할 것입니다세다()메서드를 사용하여 카운트를 찾기 위해 전체 컬렉션을 반복하지만 LINQ code에는 실제로 Count 속성이 있는지 감지하고 존재하는 경우 이를 사용하는 몇 가지 최적화 기능이 있다고 생각합니다.

    따라서 둘 다 거의 동일한 작업을 수행해야 합니다. Count 속성은 유형을 확인할 필요가 없기 때문에 아마도 약간 더 나을 것입니다.

  • 답변 # 5

    있는 경우세다또는길이속성, 당신은 항상 그것을 선호해야합니다세다()일반적으로 전체 컬렉션을 반복하여 내부의 요소 수를 계산하는 메서드입니다. 예외는 다음과 같습니다.세다()메서드는 LINQ to SQL 또는 LINQ to Entities 원본에 대한 것입니다. 예를 들어 이 경우 데이터 원본에 대해 개수 쿼리를 수행합니다. 그렇더라도 만약에세다할 일이 적기 때문에 선호할 것입니다.

  • 답변 # 6

    .세다()메소드가 충분히 똑똑하거나 문제의 유형에 대해 알고 할 수있으며, 그렇다면 기본.세다재산.

    그렇지 않을 수도 있습니다.

    컬렉션에.세다속성 자체가 성능면에서 가장 좋은 방법이 될 것입니다.

    만약.세다()메서드는 컬렉션에 대해 알지 못하므로 컬렉션을 열거하며 이는 O(n) 작업이 됩니다.

    Count 속성을 사용하는 것이 더 나을 수 있지만 ICollection.Count를 사용하여 만드는 Count() 메서드는 여기에 문서화되어 있습니다. msdn.microsoft.com/en-us/library/bb338038(v=vs.110).aspx

    nawfal2022-02-13 23:14:00

    당신이 거의 모든 것을 어떻게 알고 있는지 모르겠습니다.

    snr2022-02-14 11:14:00
  • 답변 # 7

    소스 디컴파일세다()확장 메서드는 객체가아이컬렉션(일반 또는 기타) 그리고 그렇다면 단순히 기본을 반환합니다.세다재산:

    따라서 code가세다전화하는 대신세다(), 유형 검사를 무시할 수 있습니다. 이론적인 성능상의 이점이 있지만 눈에 띄는 이점이 있을지는 의문입니다!

    //System.Linq.Enumerable
    public static int Count<TSource>(this IEnumerable<TSource> source)
    {
        checked
        {
            if (source== null)
            {
                throw Error.ArgumentNull("source");
            }
            ICollection<TSource> collection= source as ICollection<TSource>;
            if (collection != null)
            {
                return collection.Count;
            }
            ICollection collection2= source as ICollection;
            if (collection2 != null)
            {
                return collection2.Count;
            }
            int num= 0;
            using (IEnumerator<TSource> enumerator= source.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    num++;
                }
            }
            return num;
        }
    }
    

    이것을 리버스 엔지니어링하기 위해 주도권을 잡은 것에 대해 +1, 매우 도움이 됩니다.

    Polynomial2022-02-13 21:04:24

    그러나 3.5에서 Count()는 제네릭이 아닌 ICollection 인터페이스를 확인하지 않는다는 점에 유의하십시오. 이것은 .NET 4에서만 추가되었습니다. 3.5와 4 모두 일반 ICollection인터페이스를 확인합니다.

    thecoop2022-02-13 21:04:24

    요소가 없는 시퀀스에서 count를 호출하면 예외가 발생합니다. 그러나 Count()는 잘 작동합니다.

    amesh2022-02-13 21:04:24
  • 답변 # 8

    짧은 버전: 다음 중에서 선택할 수 있는 경우세다재산과세다()메서드는 항상 속성을 선택합니다.

    차이점은 주로 작업의 효율성에 있습니다. 노출하는 모든 BCL 컬렉션세다속성은 O(1) 방식으로 그렇게 합니다. 그만큼세다()이 방법은 O(N) 비용이 들 수 있고 종종 그렇게 될 것입니다. 일부 구현을 위해 O(1)에 시도하고 가져오기 위한 몇 가지 검사가 있지만 결코 보장되지는 않습니다.

  • 답변 # 9

    카운트()LINQ의 확장 방법이 있습니까?세다에 속성입니다목록s, 실제 .NET 컬렉션 개체.

    그러므로,세다()컬렉션/쿼리 가능한 개체를 열거하기 때문에 거의 항상 느립니다. 목록, 대기열, 스택 등에서 사용세다. 또는 배열의 경우 -길이.

  • 이전 Android에서 모든 이미지 가져오기
  • 다음 {{ form }} 태그를 사용하여 Django 양식이 템플릿에 표시되지 않음