我应该重构这些嵌套的foreach语句吗?

时间:2016-05-26 13:15:34

标签: c# wpf foreach nested-loops

我有一些功能允许用户在多个目录中搜索某种类型的文件,然后只将这些文件的路径添加到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

2 个答案:

答案 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,很难调试。 但是有效。