My List<> 返回找到的确切文件数,但在整个循环中显示相同的数据

本文关键字:循环 数据 显示 返回 List 文件 My | 更新日期: 2023-09-27 18:18:16

问题:

在我的程序中,当我尝试循环找到的整个文件列表时,我得到了我的列表中的 8 个文件,但显示相同的数据值。

定义:类:

1.SearchFile.cs = 有一个接受 2 个参数(PathToSearchfileExtensionToSearch(的方法,然后返回">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; }
}
  1. 我的主要程序:

    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 个不同的文件,然后将其添加到我的列表中并通过放置一些断点(调试(成功返回它。

My List<> 返回找到的确切文件数,但在整个循环中显示相同的数据

您总是在修改 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;
}