использование списка IEnumerable вне цикла foreach - PullRequest
1 голос
/ 05 ноября 2019

Я использую IEnumerable в a для каждого цикла следующим образом:

foreach (IListBlobItem blobItem in container.ListBlobs())
{        
    if (blobItem is CloudBlobDirectory)
    {
        CloudBlobDirectory directory = (CloudBlobDirectory)blobItem;
        IEnumerable<IListBlobItem> blobs = directory.ListBlobs(true);
    }                
}
await ProcessBlobs(blobs);

Я хотел бы использовать blobs переменную вне этого цикла foreach, но я получаю это сообщение: blobs doesnot exist in the current context

Я решил определить blobs вне цикла foreach:

IEnumerable<IListBlobItem> blobs = new IEnumerable<IListBlobItem>;

foreach (IListBlobItem blobItem in container.ListBlobs())
{           
    if (blobItem is CloudBlobDirectory)
    {
        //Console.WriteLine(blobItem.Uri);
        CloudBlobDirectory directory = (CloudBlobDirectory)blobItem;
        IEnumerable<IListBlobItem> blobs = directory.ListBlobs(true);                    
    }
}

, но я получаю ошибку: can not create an instance of the abstract class or interface IEnumerable<IListBlobItem>

У вас есть идеи, как я могурешить эту проблему?

Ответы [ 5 ]

2 голосов
/ 05 ноября 2019

Попробуйте использовать Enumerable.Empty<TResult>, например так:

IEnumerable<IListBlobItem> blobs = Enumerable.Empty<IListBlobItem>();

Это вернет пустое, ненулевое перечисляемое значение.

См. .NET API Documentation

2 голосов
/ 05 ноября 2019

Вы можете объявить blobs пустой коллекцией , скажем, массив:

   // Empty
   IEnumerable<IListBlobItem> blobs = new IListBlobItem[0];

   foreach (IListBlobItem blobItem in container.ListBlobs())
   {
      if (blobItem is CloudBlobDirectory)
      {
          CloudBlobDirectory directory = (CloudBlobDirectory)blobItem;
          blobs = directory.ListBlobs(true);                    
      }            
   }

   // process either blobs from foreach or an empty collection
   await ProcessBlobs(blobs); 
1 голос
/ 05 ноября 2019

Вы пытаетесь создать объект интерфейса, который невозможен. Вместо этого объявите blobs как объект и затем конвертируйте его в IEnumerable<IListBlobItem>.

object blobs = null;

foreach (IListBlobItem blobItem in container.ListBlobs())
{           
    if (blobItem is CloudBlobDirectory)
    {
        //Console.WriteLine(blobItem.Uri);
        CloudBlobDirectory directory = (CloudBlobDirectory)blobItem;
        blobs = directory.ListBlobs(true);                    
    }
}
///usage:
///(IEnumerable<IListBlobItem>)blobs

Кроме того, вы можете объявить BLOB-объекты как IEnumerable<IListBlobItem>, которые покрывают другие ответы.

1 голос
/ 05 ноября 2019

Установить IEnumerable blob как свойство следующим образом:

IEnumerable<IListBlobItem> blobs{get;set;}
1 голос
/ 05 ноября 2019

Используйте default, чтобы получить значение по умолчанию. Это возвратит нуль для ссылочного типа

IEnumerable<IListBlobItem> blobs = default(IEnumerable<IListBlobItem>);

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/default

...