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
'programing' 카테고리의 다른 글
R이 단축 축 레이블(과학적 표기법) 표시를 중지하도록 합니다(예: 1e+00). (0) | 2023.06.15 |
---|---|
오브젝트 키를 기반으로 TypeScript에서 동적으로 열거형을 생성하는 방법이 있습니까? (0) | 2023.06.15 |
한 사전이 다른 더 큰 사전의 하위 집합인지 확인하는 방법은 무엇입니까? (0) | 2023.06.15 |
.contiguous()는 PyTorch에서 무엇을 합니까? (0) | 2023.06.15 |
ASP.NET Web API - Startup.cs 이 존재하지 않습니다. (0) | 2023.06.10 |