Эффективный тест 'Count () == 1' Linq Enumerable

S3 - это хранилище объектов, у него нет реальной структуры каталогов. «/» Довольно косметический. Одна из причин, по которой люди хотят иметь структуру каталогов, потому что они могут поддерживать / обрезать / добавлять дерево в приложение. Для S3 вы относитесь к такой структуре как к индексу или поисковому тегу.

Чтобы манипулировать объектом в S3, вам нужно boto3.client или boto3.resource, например. Чтобы перечислить весь объект

import boto3 
s3 = boto3.client("s3")
all_objects = s3.list_objects(Bucket = 'my-bucket-name') 

http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects

Напоминание о boto3: boto3.resource - хороший API высокого уровня. Есть плюсы и минусы, использующие boto3.client vs boto3.resource. Если вы создаете внутреннюю общую библиотеку, то с помощью boto3.resource вы получите слой черного ящика над используемыми ресурсами.

29
задан Community 23 May 2017 в 11:54
поделиться

7 ответов

int constrainedCount = yourSequence.Take(2).Count();

// if constrainedCount == 0 then the sequence is empty
// if constrainedCount == 1 then the sequence contains a single element
// if constrainedCount == 2 then the sequence has more than one element
63
ответ дан LukeH 23 May 2017 в 11:54
поделиться

Этот код берет отличный ответ LukeH и оборачивает его как расширение IEnumerable, так что ваш код может работать с терминами None, One и Many, а не 0, 1 и 2.

public enum Multiplicity
{
    None,
    One,
    Many,
}

В статическом классе, например, EnumerableExtensions:

public static Multiplicity Multiplicity<TElement>(this IEnumerable<TElement> @this)
{
    switch (@this.Take(2).Count())
    {
        case 0: return General.Multiplicity.None;
        case 1: return General.Multiplicity.One;
        case 2: return General.Multiplicity.Many;
        default: throw new Exception("WTF‽");
    }
}
10
ответ дан Paul Ruane 23 May 2017 в 11:54
поделиться

Один из способов - написать новый метод расширения

public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
  using (var enumerator = enumerable.GetEnumerator()) {
    if (!enumerator.MoveNext()) {
      return false;
    }
    return !enumerator.MoveNext();
  }
}
.
15
ответ дан JaredPar 23 May 2017 в 11:54
поделиться

При использовании linq для объектов SingleOrDefault выдает, если имеется более одного элемента, поэтому вам, вероятно, лучше, если вы бросите свой собственный.

РЕДАКТИРОВАТЬ : Теперь я видел ответ Люка, и должен сказать, что предпочитаю его. Жаль, что я сам об этом не подумал!

1
ответ дан Paul Fleming 23 May 2017 в 11:54
поделиться

Другой способ:

bool containsMoreThanOneElement = yourSequence.Skip(1).Any();

Или для ровно 1 элемента:

bool containsOneElement = yourSequence.Any() && !yourSequence.Skip(1).Any();
9
ответ дан CodeNaked 23 May 2017 в 11:54
поделиться

Эффективный Count() == n тест:

public static bool CountIsEqualTo<T>(this IEnumerable<T> enumerable, int c) 
{
    using (var enumerator = enumerable.GetEnumerator()) 
    {
        for(var i = 0; i < c ; i++)
            if (!enumerator.MoveNext()) 
                return false;

        return !enumerator.MoveNext();
    }
}
2
ответ дан 3dGrabber 23 May 2017 в 11:54
поделиться
bool hasTwo = yourSequence.ElementAtOrDefault(1) != default(T);

... в случае класса, где значения могут быть нулевыми, это может быть полезно.

0
ответ дан juFo 23 May 2017 в 11:54
поделиться
Другие вопросы по тегам:

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