How do I ensure a sequence has a certain length?

Попробуйте android:layout_centerInParent="true" или android:layout_centerHorizontal="true", они относятся к RelativeLayout

.
22
задан guhou 29 September 2010 в 13:46
поделиться

2 ответа

Это должно сделать это:

public static bool ContainsExactlyOneItem<T>(this IEnumerable<T> source)
{
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        // Check we've got at least one item
        if (!iterator.MoveNext())
        {
            return false;
        }
        // Check we've got no more
        return !iterator.MoveNext();
    }
}

Вы можете исключить это дальше, но я не советую вам делать это:

public static bool ContainsExactlyOneItem<T>(this IEnumerable<T> source)
{
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        return iterator.MoveNext() && !iterator.MoveNext();
    }
}

Это Такая хитрая хитрость, но, вероятно, не должна использоваться в производственном коде. Это просто недостаточно ясно. Дело в том, что побочный эффект в LHS & amp; оператор, необходимый для правильной работы RHS, просто отвратителен ... хотя это очень весело;)

РЕДАКТИРОВАТЬ: Я только что видел, что вы придумали точно то же самое, но на произвольную длину. Ваше окончательное утверждение возврата неверно - оно должно быть возвращено !en.MoveNext(). Вот полный метод с более хорошим именем (IMO), проверкой аргументов и оптимизацией для ICollection / ICollection<T>:

public static bool CountEquals<T>(this IEnumerable<T> source, int count)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    if (count < 0)
    {
        throw new ArgumentOutOfRangeException("count",
                                              "count must not be negative");
    }
    // We don't rely on the optimizations in LINQ to Objects here, as
    // they have changed between versions.
    ICollection<T> genericCollection = source as ICollection<T>;
    if (genericCollection != null)
    {
        return genericCollection.Count == count;
    }
    ICollection nonGenericCollection = source as ICollection;
    if (nonGenericCollection != null)
    {
        return nonGenericCollection.Count == count;
    }
    // Okay, we're finally ready to do the actual work...
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        for (int i = 0; i < count; i++)
        {
            if (!iterator.MoveNext())
            {
                return false;
            }
        }
        // Check we've got no more
        return !iterator.MoveNext();
    }
}

РЕДАКТИРОВАТЬ: А теперь для функциональных поклонников, рекурсивная форма CountEquals ( пожалуйста, не используйте это , оно здесь только для хихиканья):

public static bool CountEquals<T>(this IEnumerable<T> source, int count)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    if (count < 0)
    {
        throw new ArgumentOutOfRangeException("count", 
                                              "count must not be negative");
    }
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        return IteratorCountEquals(iterator, count);
    }
}

private static bool IteratorCountEquals<T>(IEnumerator<T> iterator, int count)
{
    return count == 0 ? !iterator.MoveNext()
        : iterator.MoveNext() && IteratorCountEquals(iterator, count - 1);
}

РЕДАКТИРОВАТЬ: Обратите внимание, что для чего-то вроде LINQ to SQL, вы должны использовать простой подход Count() - потому что это позволит сделать это в базе данных, а не после получения реальных результатов.

20
ответ дан 29 November 2019 в 05:12
поделиться

seq.Skip(1).Any() сообщит вам, есть ли в списке ноль или один элемент.

Я думаю, что редактирование, которое вы сделали, является наиболее эффективным способом проверки длины n. Но есть логическая ошибка, элементы меньше длины вернут истину. Посмотрите, что я сделал со вторым оператором return.

    public static bool LengthEquals<T>(this IEnumerable<T> en, int length)
    {
        using (var er = en.GetEnumerator())
        {
            for (int i = 0; i < length; i++)
            {
                if (!er.MoveNext())
                    return false;
            }
            return !er.MoveNext();
        }
    }
4
ответ дан 29 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: