My List<> 返回找到的确切文件数,但在整个循环中显示相同的数据
本文关键字:循环 数据 显示 返回 List 文件 My | 更新日期: 2023-09-27 18:18:16
问题:
在我的程序中,当我尝试循环找到的整个文件列表时,我得到了我的列表中的 8 个文件,但显示相同的数据值。
定义:类:
1.SearchFile.cs = 有一个接受 2 个参数(PathToSearch 和 fileExtensionToSearch(的方法,然后返回">FileDetails"类型的列表。
public List<FileDetails> fileListFound = new List<FileDetails>();
public List<FileDetails> GetListFiles(string strPath, string strFileExtension)
{
DirectoryInfo dirInfo = new DirectoryInfo(strPath);
FileInfo[] files = dirInfo.GetFiles(strFileExtension, SearchOption.AllDirectories);
FileDetails fileDetails = new FileDetails();
foreach (FileInfo currentFile in files)
{
fileDetails.FileFullName = currentFile.FullName;
fileDetails.FileFullPath = strPath;
fileListFound.Add(fileDetails);
}
return fileListFound;
}
2.文件详情.cs
class FileDetails
{
public string FileFullName { get; set; }
public string FileFullPath { get; set; }
public string FileType { get; set; }
}
我的主要程序:
static void Main(string[] args) { string strPath = @"C:'Users'Public'Pictures'Sample Pictures"; FileCollection fileCollected = new FileCollection(); List<FileDetails> listOfFileFound = fileCollected.GetListFiles(strPath, "*.jpg"); foreach (FileDetails fileFound in listOfFileFound) { Console.WriteLine("Full Name: " + fileFound.FileFullName + ", Path:" + fileFound.FileFullPath); } Console.ReadLine(); }
注意:我使用控制台应用程序只是为了清楚我的问题。
示例输出: (8 找到文件(
...''图片**郁金香.jpg**
...''图片**郁金香.jpg**
...''图片**郁金香.jpg**
等,以相同的输出循环 8 次
注意:我可以告诉 SearchFile.cs 类找到了 8 个不同的文件,然后将其添加到我的列表中并通过放置一些断点(调试(成功返回它。
您总是在修改 fileDetails
的同一实例。您需要在每次迭代时在循环中分配一个新的:
foreach (FileInfo currentFile in files)
{
FileDetails fileDetails = new FileDetails();
fileDetails.FileFullName = currentFile.FullName;
fileDetails.FileFullPath = strPath;
fileListFound.Add(fileDetails);
}
由于 fileDetails 是添加到列表中的引用,因此修改同一实例将导致列表中的所有值都相同。
因为你把一个实例放在所有的列表中
更改此设置:
FileDetails fileDetails = new FileDetails();
foreach (FileInfo currentFile in files)
{
fileDetails.FileFullName = currentFile.FullName;
fileDetails.FileFullPath = strPath;
fileListFound.Add(fileDetails);
}
对此:
foreach (FileInfo currentFile in files)
{
FileDetails fileDetails = new FileDetails(); // IN THE LOOP
fileDetails.FileFullName = currentFile.FullName;
fileDetails.FileFullPath = strPath;
fileListFound.Add(fileDetails);
}
fileDetails
变量表示一个类,这意味着它是一个引用类型,这意味着您只需将一个相同的项放入列表中八次 - 也就是说,当您使用诸如
fileDetails.FileFullName = currentFile.FullName;
您只需更新类实例数据,这些数据将反映在每个引用中。
您需要做的是为每个文件创建一个新的FileDetails
实例,如下所示:
foreach (FileInfo currentFile in files)
{
fileListFound.Add(
new FileDetails
{
FileFullName = currentFile.FullName,
FileFullPath = strPath
}
);
}
您应该为每个列表项创建新的FileDetails
对象。否则,您将在每个循环中覆盖相同的项目。
这是因为您的 foreach 循环包含错误的代码。
您需要在每次迭代时重新声明 fileDetails - 发生的情况是所有 fileListFound 对象都包含对象文件的一个副本详细信息,以及当您更改时最后一个 - 它改变了其余部分。
这是固定代码:
public List<FileDetails> fileListFound = new List<FileDetails>();
public List<FileDetails> GetListFiles(string strPath, string strFileExtension)
{
DirectoryInfo dirInfo = new DirectoryInfo(strPath);
FileInfo[] files = dirInfo.GetFiles(strFileExtension, SearchOption.AllDirectories);
foreach (FileInfo currentFile in files)
{
FileDetails fileDetails = new FileDetails();
fileDetails.FileFullName = currentFile.FullName;
fileDetails.FileFullPath = strPath;
fileListFound.Add(fileDetails);
}
return fileListFound;
}