问题:
在我的程序中,当我尝试循环找到整个文件列表时,我的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; }
}
我的主要计划:
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个文件)
... \图片** ** Tulips.jpg
... \图片** ** Tulips.jpg
... \图片** ** Tulips.jpg
等.. 使用相同的输出循环8次
注意:我可以说 SearchFile.cs 类找到了8个不同的文件,然后将其添加到我的列表< / strong>并通过放置一些断点(Debug)来成功返回它。
答案 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;
}