IEnumberable에 두 개 이상의 요소가 있는지 효율적으로 확인하려면 어떻게 해야 합니까?
초기화된 경우IEnumerable
:
IEnumerable<T> enumerable;
두 개 이상의 요소가 있는지 확인하고 싶습니다.이를 위한 가장 확실한 방법은 다음과 같습니다.
enumerable.Count() > 1
하지만, 나는 믿습니다.Count()
전체 컬렉션을 열거합니다. 이 사용 사례에는 필요하지 않습니다.예를 들어 컬렉션에 매우 많은 양의 요소가 포함되어 있거나 외부 소스에서 데이터를 제공하는 경우 성능 측면에서 상당히 낭비적일 수 있습니다.
두 개 이상의 요소를 열거하지 않고 어떻게 할 수 있습니까?
시스템에서 확장 방법을 결합하여 여러 가지 방법으로 테스트할 수 있습니다.Linkq... 다음은 두 가지 간단한 예입니다.
bool twoOrMore = enumerable.Skip(1).Any();
bool twoOrMoreOther = enumerable.Take(2).Count() == 2;
나는 일반적인 방법으로 확인하기 때문에 첫 번째 것을 선호합니다.Count() >= 1
와 함께 있음Any()
그래서 저는 그것이 더 읽기 쉽다는 것을 알게 되었습니다.
재미를 위해 Next()에 두 번 전화한 다음 다른 IE number를 받으십시오.
또는 이 특정 목표에 대한 작은 래퍼 클래스를 작성합니다.EnumerablePrefetcher : IEnumerable<T>
초기화 시 지정된 양의 항목을 가져오려고 합니다.
그것의.IEnumerable<T> GetItems()
방법은 이러한 방식으로 수익률을 사용해야 합니다.
foreach (T item in prefetchedItems) // array of T, prefetched and decided if IEnumerable has at least n elements
{
yield return item;
}
foreach (T item in otherItems) // IEnumerable<T>
{
yield return item;
}
@Cameron-S의 솔루션은 더 단순하지만 아래가 더 효율적입니다.저는 이를 바탕으로 생각해냈습니다.Enumerable.Count()
방법. Skip()
항상 반복되며 단락이 발생하지 않습니다.source
의 가치가 있는ICollection
또는ICollection<T>
유형.
/// <summary>
/// Returns true if source has at least <paramref name="count"/> elements efficiently.
/// </summary>
/// <remarks>Based on int Enumerable.Count() method.</remarks>
public static bool HasCountOfAtLeast<TSource>(this IEnumerable<TSource> source, int count)
{
source.ThrowIfArgumentNull("source");
var collection = source as ICollection<TSource>;
if (collection != null)
{
return collection.Count >= count;
}
var collection2 = source as ICollection;
if (collection2 != null)
{
return collection2.Count >= count;
}
int num = 0;
checked
{
using (var enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
if (num >= count)
{
return true;
}
}
}
}
// returns true for source with 0 elements and count 0
return num == count;
}
저도 비슷한 요구사항이 있었지만, IE number에서 단일 값만 있으면 단일 값을 가져오는 것이었습니다.나는 그것에 대한 확장 방법을 만들었습니다:
public static S OneOnlyOrDefault<S>(this IEnumerable<S> items)
{
var rtn = default(S);
using (var en = items.GetEnumerator())
{
if (en.MoveNext())
{
rtn = en.Current;
}
if (en.MoveNext())
{
rtn = default(S);
}
}
return rtn;
}
질문에 답하려면 이 컬렉션에 하나의 항목만 포함되어 있습니까?다음 작업을 수행할 수 있습니다(이 경우 컬렉션에 참조 유형이 포함됨).
if (myList.OneOnlyOrDefault() == null)
{
// list is either empty or contains more than one item
}
언급URL : https://stackoverflow.com/questions/17286950/how-can-i-efficiently-determine-if-an-ienumerable-has-more-than-one-element
'programing' 카테고리의 다른 글
모서리 반지름 설정 버튼 템플릿 (0) | 2023.05.29 |
---|---|
mongo 스크립트로 파일 쓰기 작업을 수행하시겠습니까? (0) | 2023.05.29 |
커밋이 수행한 작업을 어떻게 표시할 수 있습니까? (0) | 2023.05.29 |
클래스의 속성 목록을 가져오는 방법은 무엇입니까? (0) | 2023.05.29 |
콘솔 응용 프로그램의 안정적인 타이머 (0) | 2023.05.29 |