在 foreach 循环之外使用 IEnumerable 列表

using an IEnumerable list outside of foreach loop

我在 for each 循环中使用 IEnumerable 如下:

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

我想在此 foreach 循环之外使用 blobs 变量,但我收到此消息:blobs doesnot exist in the current context

我决定在 foreach 循环之外定义 blobs

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>

你知道我该如何解决这个问题吗?

您可以将 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); 

使用default获取默认值。对于引用类型

,这将 return null
IEnumerable<IListBlobItem> blobs = default(IEnumerable<IListBlobItem>);

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

尝试使用 Enumerable.Empty<TResult>,像这样:

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

这将 return 一个空的、非空的可枚举对象。

.NET API Documentation

以这种方式设置 IEnumerable blob,如 属性:

IEnumerable<IListBlobItem> blobs{get;set;}

您正在尝试创建一个不可能的接口对象。相反,将 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> 其他答案涵盖的内容。