programing

IEnumberable에 Count 메서드가 없습니다.

abcjava 2023. 6. 15. 21:30
반응형

IEnumberable에 Count 메서드가 없습니다.

다음과 같은 방법이 있습니다.

public bool IsValid
{
  get { return (GetRuleViolations().Count() == 0); }
}

public IEnumerable<RuleViolation> GetRuleViolations(){
  //code here
}

왜 내가 그럴 때?.Count()그 위에 빨간색으로 밑줄이 쳐져 있습니까?

다음 오류가 발생했습니다.

오류 1 '시스템'.컬렉션.포괄적인.IEnumberable'에 'Count'에 대한 정의와 'System' 유형의 첫 번째 인수를 수락하는 확장 메서드 'Count'가 없습니다.컬렉션.포괄적인.'IEnumberable'을 찾을 수 있습니다(지시나 어셈블리 참조를 사용하는 것이 누락되었습니까?) c:\users\a\basic\visual studio 2010\Projects\NerdDinner\Models\Dinner.cs 1547 NerdDinner

추가할 항목:

using System.Linq;

소스의 맨 위에 있는 시스템에 대한 참조가 있는지 확인합니다.코어 어셈블리.

Count() 는 정적 클래스에서 제공하는 확장 메서드로, 정적 클래스에서는 LINQ에서 객체로, LINQ에서 SQL 및 기타 처리되지 않은 공급자에 대해 제공합니다.

편집: 실제로 사용Count()여기서는 상대적으로 비효율적입니다(적어도 LINQ to Objects에서는).당신이 알고 싶은 것은 요소가 있느냐 없느냐 하는 것입니다, 그렇죠?그런 경우에는,Any()더 적합합니다.

public bool IsValid
{
  get { return !GetRuleViolations().Any(); }
}

Any()또는Count()Linq의 메소드는 제네릭 형식에서만 작동합니다.

IEnumerable<T>

간단한 것이 있다면,IEnumerable유형 없이, 사용해 보십시오.

IEnumerable<object> 

대신.

IEnumeration라는 메서드가 없습니다.Count()그것은 일종의 "요소의 순서"일 뿐입니다.예를 들어 사용List요소 수가 명시적으로 필요한 경우.만약 당신이 Linkq를 사용한다면, 그 확장 방법을 명심하세요.Count()호출할 때마다 실제로 요소 수를 다시 셀 수 있습니다.

의 함정에 대한 짧고 달콤한 경고의 일반적인 말.으로 이 게시물에 걸려 넘어지는 지친 여행자를 돕기 위해 카운트()!

단편:

의심할 여지 없이 다음과 같은 작업이 수행되지만 열거형이 유용하거나 사전 계산된 '카운트'가 있는 기본 배열 또는 목록에서 지원되지 않으면 성능 저하가 거의 발생하지 않을 수 있습니다.

public bool IsValid
{
   get { return SomeMethodReturningEnumerable().Count() <= threshold; }  <--- small performance issue here
}

public IEnumerable<SomeObject> SomeMethodReturningEnumerable(){
   yield return foo;
   yield return bar; etc
}

에 대한 통화입니다.Count() 메서드는 열거 가능한 각 항목을 거친 다음 전체 카운트를 임계값과 비교합니다.우리가 더 똑똑해지는 것은 약간 더 나은 일을 할 수 있습니다.

    public bool IsValid
    {
       get { return !SomeMethodReturningEnumerable().HasMoreThan(threshold); }  <--- neato!
    }

    public static bool HasLessThan<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count - 1);

    public static bool HasLessOrEqualTo<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count);

    public static bool HasMoreOrEqualTo<T>(this IEnumerable<T> sequence, int count) => sequence.HasMoreThan(count - 1);

    public static bool HasMoreThan<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: false);

    public static bool HasExactly<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: true);

    public static bool EnumerationCounterImpl<T>(this IEnumerable<T> sequence, int count, bool equals_vs_greaterThan = true) //0
    {
        if (equals_vs_greaterThan && count < 0)
            throw new ArgumentException($"{nameof(count)} is less than zero!");

        if (!equals_vs_greaterThan && count < 0)
            return true;

        var staticCount = (sequence as ICollection)?.Count                              
                          ?? (sequence as ICollection<T>)?.Count
                          ?? (sequence as IReadOnlyCollection<T>)?.Count;

        if (staticCount != null)
            return staticCount > count;

        using (var enumerator = sequence.GetEnumerator()) //1 optimization
        {
            for (int i = 0; i < count + 1; i++)
            {
                if (enumerator.MoveNext())
                    continue;

                return false;
            }

            return !equals_vs_greaterThan //     ==
                   || enumerator.MoveNext(); //  >
        }

        //0 https://blog.slaks.net/2015-01-12/linq-count-considered-occasionally-harmful/
        //1 using the enumerator directly is slightly faster than using LINQ methods   it avoids allocating an extra iterator
        //  state machine compared to using skip()
    }

자! 다시 문제가 해결되었지만 이번에는 성능을 중시합니다!

어때요?

public bool IsValid
{
    get { return (GetRuleViolations().Cast<RuleViolation>().Count() == 0); }
}

언급URL : https://stackoverflow.com/questions/2659290/ienumerable-doesnt-have-a-count-method

반응형