我有一些功能允许用户在多个目录中搜索某种类型的文件,然后只将这些文件的路径添加到listbox
。现在,它是通过一些嵌套的foreach
语句完成的。它将检索成千上万的文件路径,所以我很好奇有什么其他有效的方法可以解决这个问题?
另外,我知道将很多项添加到listbox
听起来很愚蠢。我只是按照我所做的去做。我有一种感觉,将来它会被要求摆脱,但文件路径仍然必须存储在某个地方的列表中。
注意:我正在使用WindowsAPICodePack
获取一个允许多个目录选择的对话框。
List<string> selectedDirectories = new List<string>();
/// <summary>
/// Adds the paths of the directories chosen by the user into a list
/// </summary>
public void AddFilesToList()
{
selectedDirectories.Clear(); //make sure list is empty
var dlg = new CommonOpenFileDialog();
dlg.IsFolderPicker = true;
dlg.AddToMostRecentlyUsedList = false;
dlg.AllowNonFileSystemItems = false;
dlg.EnsureFileExists = true;
dlg.EnsurePathExists = true;
dlg.EnsureReadOnly = false;
dlg.EnsureValidNames = true;
dlg.Multiselect = true;
dlg.ShowPlacesList = true;
if (dlg.ShowDialog() == CommonFileDialogResult.Ok)
{
selectedDirectories = dlg.FileNames.ToList(); //add paths of selected directories to list
}
}
/// <summary>
/// Populates a listbox with all the filepaths of the selected type of file the user has chosen
/// </summary>
public void PopulateListBox()
{
foreach (string directoryPath in selectedDirectories) //for each directory in list
{
foreach (string ext in (dynamic)ImageCB.SelectedValue) //for each file type selected in dropdown
{
foreach (string imagePath in Directory.GetFiles(directoryPath, ext, SearchOption.AllDirectories)) //for each file in specified directory w/ specified format(s)
{
ListBox1.Items.Add(imagePath); //add file path to listbox
}
}
}
}
修改:不确定它是否有所作为,但我使用的是WPF
listbox
,而不是winforms
。
答案 0 :(得分:1)
开始重构学习Linq的一种方法是使用AddRange方法。关于它比for循环的性能优势的一个很好的解释: https://stackoverflow.com/a/9836512/4846465
然而,这个问题可能没有一个答案。
foreach (var directoryPath in selectedDirectories)
{
foreach (string ext in (dynamic)ImageCB)
{
ListBox1.Items.AddRange(Directory.GetFiles(directoryPath, ext, SearchOption.AllDirectories).ToArray());
}
}
答案 1 :(得分:-3)
你可以重构它,或者你可以保留原样。
如果你重构它;
您的代码将更具可读性,可理解性和可重用性。 你需要编写几种方法。
您的方法可以用于其他方面,例如您当前的方法。
并且有效。
如果你保留原样;
您的代码有效。但很难理解和阅读。如果有bug,很难调试。 但是有效。