programing

IEnumberable에 두 개 이상의 요소가 있는지 효율적으로 확인하려면 어떻게 해야 합니까?

oldcodes 2023. 5. 29. 11:09
반응형

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

반응형