我的清单<>返回找到的确切文件数但BUT在整个循环中显示相同的数据

时间:2011-12-18 13:09:13

标签: c# .net wpf silverlight

问题:

在我的程序中,当我尝试循环找到整个文件列表时,我的List BUT上的 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.FileDetails.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();
    }
    
  2. 注意:我使用控制台应用程序只是为了清楚我的问题。

    示例输出:(找到8个文件)

    ... \图片** ** Tulips.jpg

    ... \图片** ** Tulips.jpg

    ... \图片** ** Tulips.jpg

    等.. 使用相同的输出循环8次

    注意:我可以说 SearchFile.cs 类找到了8个不同的文件,然后将其添加到我的列表< / strong>并通过放置一些断点(Debug)来成功返回它。

5 个答案:

答案 0 :(得分:4)

您始终在修改fileDetails的同一个实例。您需要在每次迭代时在循环内分配一个新的:

    foreach (FileInfo  currentFile in files)
    {
        FileDetails fileDetails = new FileDetails();
        fileDetails.FileFullName = currentFile.FullName;
        fileDetails.FileFullPath = strPath;

        fileListFound.Add(fileDetails);

    }

由于fileDetails是一个被添加到列表中的引用,修改同一个实例将导致列表中的所有值都相同。

答案 1 :(得分:3)

fileDetails变量代表一个类,这意味着它是一个引用类型,这意味着您只需将一个相同的项放入列表中八个次 - 也就是说,使用

等行设置文件详细信息时
fileDetails.FileFullName = currentFile.FullName;

您只是更新类实例数据,这些数据将反映在每个引用中。

您需要做的是为每个文件创建一个{em> new FileDetails实例,如:

foreach (FileInfo  currentFile in files)
{
    fileListFound.Add(
        new FileDetails
        {
            FileFullName  = currentFile.FullName,
            FileFullPath = strPath
        }
    );   
}

答案 2 :(得分:3)

因为你在所有LIST中放了一个实例

改变这个:

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);

    }

答案 3 :(得分:1)

您应该为每个列表项创建新的FileDetails对象。否则,每次循环都会覆盖相同的项目。

答案 4 :(得分:1)

那是因为你的foreach循环包含错误的代码。

你需要在每次迭代时重新声明fileDetails - 会发生什么 您的所有fileListFound对象都包含对象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);


    foreach (FileInfo  currentFile in files)
    {
        FileDetails fileDetails = new FileDetails();
        fileDetails.FileFullName = currentFile.FullName;
        fileDetails.FileFullPath = strPath;

        fileListFound.Add(fileDetails);
    }

    return fileListFound;
}