Foreach的使用场合

时间:2021-11-09 08:14:34
今天遇到个怪问题,上传几个文件的时候是这样用的,
// 获取所有文件
HttpFileCollection allFiles = request.Files;
想这样使用
foreach (HttpPostedFile file in allFiles) {
     // 但是这里报错,说字符串不能转成HttpPostedFile
}
但是这样不行,虽然知道了不行了,但是很想知道到底在什么情况下才能使用foreach,请各位高手在这里讲解一下,谢谢!

32 个解决方案

#1


奇怪的是,那个叫什么思归的居然也这么写过,真是很奇怪了,难道以前可以?

#2


关注...

#3


HttpFileCollection allFiles = Request.Files; 
想这样使用 
foreach (HttpPostedFile file in allFiles) { 

这样是没有问题的

你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
代码是什么?

#4


foreach (HttpPostedFile file in allFiles) { 这一行报错了

#5


foreach (HttpPostedFile file in allFiles) { 
    // 但是这里报错,说字符串不能转成HttpPostedFile 



应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?

foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码

#6


学.NET来第一次遇到这种问题,因为见过它可以以数组形式方访问,所以就想试试foreach,结果试出问题了

#7


实现了IEnumerable和IEnumerator两个接口的数据结构都可以用foreach遍历

#8


foreach 应用于Collection,List<T>等的遍历

#9


谢谢楼上的回复!
查过了,确实是那个地方出问题了,如果改成
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
完整代码
 
   public static string[] PutFileToFolder(HttpRequest request)
    {
        // 设置文件存放路径
        string folderPath = HttpContext.Current.Server.MapPath(string.Format("~/{0}/{1}/", STORE_FILE_PATH, DateTime.Now.ToString("yyyyMM")));

        // 文件不存在
        if (System.IO.Directory.Exists(folderPath) == false)
            System.IO.Directory.CreateDirectory(folderPath);

        // 文件存放数组
        ArrayList filelist = new ArrayList();

        // 获取所有文件
        HttpFileCollection allFiles = request.Files;
        for (int i = 0; i < allFiles.Count; i++)  // 这里不出错
        { 
            
        }
        foreach (HttpPostedFile myfiles in allFiles) { // 这里出错
            
        }
        ////STORE_FILE_PATH
        //string filePath = string.Empty;
        //string fileExt = string.Empty;
        //for (int i = 0; i < allFiles.Count; i++)
        //{
        //    HttpPostedFile file = allFiles[i];

        //    // 空文件
        //    if (file.ContentLength == 0) continue;
        //    fileExt = System.IO.Path.GetExtension(file.FileName);

        //    // 设置文件路径,名字,后缀
        //    filePath = string.Format("{0}{1}{2}", folderPath, DateTime.Now.Ticks.ToString(), fileExt);

        //    // 保存文件
        //    file.SaveAs(filePath);

        //    // 将路径加入列表
        //    filelist.Add(filePath);
        //}
        return new string[] { };
    }

#10


可以使用For
HttpPostedFile file = allFiles[i];

#11


IEnumerable这个已经被实现了,但是还是不能遍历,不知道是什么原因!高手解答

#12


在我这边
HttpRequest req = this.Request;
HttpFileCollection allFiles = req.Files;
foreach (HttpPostedFile file in allFiles)
{
}


没有任何问题,不知道楼主问题出在哪。

#13


看MSDN上的一段话:
In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach. 
只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
HttpFileCollection 反射出来的结果为下面的内容
public sealed class HttpFileCollection : NameObjectCollectionBase
{......}
而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。

#14


我的.net环境是2.0,不知道是不是版本不合的原因。我这边是出问题了。呵呵!

#15


现在的场合很简单了,我改了代码
前台aspx
        <div id="divFilesPanel">
            <ul>
            <li><asp:FileUpload ID="myfile" runat="server" /></li>
            </ul>
            <div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
        </div>

后台cs
    protected void btnUploadFile_Click(object sender, EventArgs e)
    {
        foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
        { }
        // WebUtility.PutFileToFolder(Request);
    }
还出那个问题!

#16


无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。 

我刚才试了一下也报这个错,

                              for(int iFile = 0; iFile < files.Count; iFile++) 


/**////'检查文件扩展名字 
HttpPostedFile postedFile = files[iFile]; 


用for循环就不会,晕

#17


我也是2.0环境,没办法,也许真是人品问题了

#18


这可咋办啊,.NET出Bug了?

#19


可能是BUG

#20


msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
HttpFileCollection应该没有实现IEnumerable接口吧!

#21


所以还是建议你用for好了

#22


引用 20 楼 qinhl99 的回复:
msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx 
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ...... 
HttpFileCollection应该没有实现IEnumerable接口吧! 


应该是实现了啊,youbl 他说他不报错...真的不知道是什么原因了

#23


应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值

#24


up

#25


any time

#26


慢慢学习

PS: 
我的目标是 ---->  Foreach的使用场合Foreach的使用场合Foreach的使用场合Foreach的使用场合Foreach的使用场合Foreach的使用场合

^_^

#27


up

#28


引用 23 楼 mjjzg 的回复:
应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值

allfile肯定是有值的,而file,根本都下不了foreach,file肯定是什么都没有了!应该算是微软一个bug吧!(可能我真的无法解释这种现象了)

#29


bug?只有人人都会出现的问题,才能称之为bug吧
你把你的项目打包,发出来给我看看
youbl@126.com

#30


的确是不能foreach的,,大家可以看看 反编译 后的.net 2.0中的实现代码

#31


HttpFileCollection 继承自 NameObjectCollectionBase,而 NameObjectCollectionBase 的 GetEnumerator() 返回 NameObjectKeysEnumerator,NameObjectKeysEnumerator 的 Current 属性返回的是 String 类型的 Key,所以当 foreach 时,Request.Files 确实是一个 String 类型集合,的确不能转换成 HttpPostedFile,而 HttpFileCollection 的 this[] 返回的确是 HttpPostedFile 类型。
如果写成 
foreach (string key in Request.Files)
{
    HttpPostedFile file = Request.Files[key];
    或者
     HttpPostedFile file = Request.Files.Get(key);
    
    ...
}
就可以
真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢

#32


给大家一个 准确的回答,是因为Upload不是服务器端控件。

 大家知道怎么回事了吧,说到底MS的Bug

#1


奇怪的是,那个叫什么思归的居然也这么写过,真是很奇怪了,难道以前可以?

#2


关注...

#3


HttpFileCollection allFiles = Request.Files; 
想这样使用 
foreach (HttpPostedFile file in allFiles) { 

这样是没有问题的

你的“// 但是这里报错,说字符串不能转成HttpPostedFile ”
代码是什么?

#4


foreach (HttpPostedFile file in allFiles) { 这一行报错了

#5


foreach (HttpPostedFile file in allFiles) { 
    // 但是这里报错,说字符串不能转成HttpPostedFile 



应该是你循环里的代码有错,是不是把file 赋值给一个字符串变量了?

foreach (HttpPostedFile file in allFiles) 这是没错的,仔细检查下代码

#6


学.NET来第一次遇到这种问题,因为见过它可以以数组形式方访问,所以就想试试foreach,结果试出问题了

#7


实现了IEnumerable和IEnumerator两个接口的数据结构都可以用foreach遍历

#8


foreach 应用于Collection,List<T>等的遍历

#9


谢谢楼上的回复!
查过了,确实是那个地方出问题了,如果改成
无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
完整代码
 
   public static string[] PutFileToFolder(HttpRequest request)
    {
        // 设置文件存放路径
        string folderPath = HttpContext.Current.Server.MapPath(string.Format("~/{0}/{1}/", STORE_FILE_PATH, DateTime.Now.ToString("yyyyMM")));

        // 文件不存在
        if (System.IO.Directory.Exists(folderPath) == false)
            System.IO.Directory.CreateDirectory(folderPath);

        // 文件存放数组
        ArrayList filelist = new ArrayList();

        // 获取所有文件
        HttpFileCollection allFiles = request.Files;
        for (int i = 0; i < allFiles.Count; i++)  // 这里不出错
        { 
            
        }
        foreach (HttpPostedFile myfiles in allFiles) { // 这里出错
            
        }
        ////STORE_FILE_PATH
        //string filePath = string.Empty;
        //string fileExt = string.Empty;
        //for (int i = 0; i < allFiles.Count; i++)
        //{
        //    HttpPostedFile file = allFiles[i];

        //    // 空文件
        //    if (file.ContentLength == 0) continue;
        //    fileExt = System.IO.Path.GetExtension(file.FileName);

        //    // 设置文件路径,名字,后缀
        //    filePath = string.Format("{0}{1}{2}", folderPath, DateTime.Now.Ticks.ToString(), fileExt);

        //    // 保存文件
        //    file.SaveAs(filePath);

        //    // 将路径加入列表
        //    filelist.Add(filePath);
        //}
        return new string[] { };
    }

#10


可以使用For
HttpPostedFile file = allFiles[i];

#11


IEnumerable这个已经被实现了,但是还是不能遍历,不知道是什么原因!高手解答

#12


在我这边
HttpRequest req = this.Request;
HttpFileCollection allFiles = req.Files;
foreach (HttpPostedFile file in allFiles)
{
}


没有任何问题,不知道楼主问题出在哪。

#13


看MSDN上的一段话:
In C#, it is not strictly necessary for a collection class to inherit from IEnumerable and IEnumerator in order to be compatible with foreach; as long as the class has the required GetEnumerator, MoveNext, Reset, and Current members, it will work with foreach. 
只要类实现了GetEnumerator, MoveNext, Reset, Current四个方法和属性就可以了,不一定说要实现IEnumerable 和IEnumerator 接口。而
HttpFileCollection 反射出来的结果为下面的内容
public sealed class HttpFileCollection : NameObjectCollectionBase
{......}
而NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback实现了四个接口,显然这符合foreach的要求.......
说类型不对,是因为Current属性的类型无法转换为要求的类型,你可以试试把string换成HttpPostedFile看看,我看应该可以了。

#14


我的.net环境是2.0,不知道是不是版本不合的原因。我这边是出问题了。呵呵!

#15


现在的场合很简单了,我改了代码
前台aspx
        <div id="divFilesPanel">
            <ul>
            <li><asp:FileUpload ID="myfile" runat="server" /></li>
            </ul>
            <div><input type="button" id="addUploadFile" value="添加上传控件" /> <asp:Button ID="btnUploadFile" runat="server" Text="开始上传" OnClick="btnUploadFile_Click" /></div>
        </div>

后台cs
    protected void btnUploadFile_Click(object sender, EventArgs e)
    {
        foreach (HttpPostedFile file in Request.Files)// 无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。
        { }
        // WebUtility.PutFileToFolder(Request);
    }
还出那个问题!

#16


无法将类型为“System.String”的对象强制转换为类型“System.Web.HttpPostedFile”。 

我刚才试了一下也报这个错,

                              for(int iFile = 0; iFile < files.Count; iFile++) 


/**////'检查文件扩展名字 
HttpPostedFile postedFile = files[iFile]; 


用for循环就不会,晕

#17


我也是2.0环境,没办法,也许真是人品问题了

#18


这可咋办啊,.NET出Bug了?

#19


可能是BUG

#20


msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ......
HttpFileCollection应该没有实现IEnumerable接口吧!

#21


所以还是建议你用for好了

#22


引用 20 楼 qinhl99 的回复:
msdn:http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx 
The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections..::.IEnumerable or ...... 
HttpFileCollection应该没有实现IEnumerable接口吧! 


应该是实现了啊,youbl 他说他不报错...真的不知道是什么原因了

#23


应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值

#24


up

#25


any time

#26


慢慢学习

PS: 
我的目标是 ---->  Foreach的使用场合Foreach的使用场合Foreach的使用场合Foreach的使用场合Foreach的使用场合Foreach的使用场合

^_^

#27


up

#28


引用 23 楼 mjjzg 的回复:
应该是没问题的,你可以断点调试到那一行看看file 和 allFiles都是什么类型的,是否有值

allfile肯定是有值的,而file,根本都下不了foreach,file肯定是什么都没有了!应该算是微软一个bug吧!(可能我真的无法解释这种现象了)

#29


bug?只有人人都会出现的问题,才能称之为bug吧
你把你的项目打包,发出来给我看看
youbl@126.com

#30


的确是不能foreach的,,大家可以看看 反编译 后的.net 2.0中的实现代码

#31


HttpFileCollection 继承自 NameObjectCollectionBase,而 NameObjectCollectionBase 的 GetEnumerator() 返回 NameObjectKeysEnumerator,NameObjectKeysEnumerator 的 Current 属性返回的是 String 类型的 Key,所以当 foreach 时,Request.Files 确实是一个 String 类型集合,的确不能转换成 HttpPostedFile,而 HttpFileCollection 的 this[] 返回的确是 HttpPostedFile 类型。
如果写成 
foreach (string key in Request.Files)
{
    HttpPostedFile file = Request.Files[key];
    或者
     HttpPostedFile file = Request.Files.Get(key);
    
    ...
}
就可以
真是奇怪啊,不能理解,如有高手看到,还望给予讲解,谢谢

#32


给大家一个 准确的回答,是因为Upload不是服务器端控件。

 大家知道怎么回事了吧,说到底MS的Bug