简体   繁体   English

在开始在C#中循环之前将项目添加到集合中

[英]Add an item to a collection just before it starts looping in C#

How do I dynamically add another path before looping to Directory.GetDirectories? 如何在循环到Directory.GetDirectories之前动态添加其他路径? :

foreach (string d in Directory.GetDirectories(dirpath))
{
    foreach (string f in Directory.GetFiles(d))
    {
        Console.WriteLine(f);
        File.Copy(f,"");
    }

}

For example I need it like 例如我需要它

foreach (Directory dir in Directory.GetDirectories(dirpath).Add("another path"))
{ 
//My other code here.... 
}

How to do it? 怎么做?

Thanks 谢谢

Maybe something like this: 也许是这样的:

Directory.GetDirectories(dirpath).Concat(new string[] { "another path"});

You need to add using System.Linq; 您需要using System.Linq;添加using System.Linq; at the top of your class. 在全班最重要的位置

Side Note on your expected result: 注意事项:

You can't foreach (Directory dir because Directory is a static class and you can't have an instance of it. But you can use DirectoryInfo : 您不能foreach (Directory dir因为Directory是一个静态类,您不能拥有它的实例。但是您可以使用DirectoryInfo

var dirs = Directory.GetDirectories(dirpath)
                    .Concat(new string[] { "another path" })
                    .Select(path => new DirectoryInfo(path));

foreach (DirectoryInfo dir in dirs)
{

}
var dir = Directory.GetDirectories(dirpath);
dir.Add("another path");
foreach (string d in dir)
 {
     foreach (string f in Directory.GetFiles(d))
     {
        Console.WriteLine(f);
        File.Copy(f,"");
     }
 }

For achieving such a goal you may use a recursive approach like: 为了实现这一目标,您可以使用以下递归方法:

  public void Fileprocessing(directories){
             foreach (string d in directories)
                            {
                foreach (string f in Directory.GetFiles(d))
                                    {
                                    Console.WriteLine(f);
                                        File.Copy(f,"");
                                    }
            }
                if(conditionToAddPath){
                directories.Add("another path");
                Fileprocessing(directories);
                }
    }

and when you call the first time initialize your directories like: 并在第一次调用时初始化目录,例如:

... ...

string[] directories = Directory.GetDirectories(dirpath);
Fileprocessing(directories);

... ...

Note: this is a pseudo-coded answer!! 注意:这是伪编码的答案!! please review before implementing or complete this answer by adding ready to use implementation code. 请在实施之前查看,或通过添加准备使用的实施代码来完成此答案。

one way using SelectMany : 一种使用SelectMany

var paths = new List<string> { "path1", "path2", "path3" };
var files = paths.SelectMany(Directory.GetDirectories).SelectMany(Directory.GetFiles);
paths.Add("path4");

foreach (var file in files)
    Console.WriteLine(file);

another way using select : 使用select另一种方式:

var paths = new List<string> { "path1", "path2", "path3" };
var query = from path in paths
            from dir in Directory.GetDirectories(path)
            from file in Directory.GetFiles(dir)
            select file;
paths.Add("path4");

foreach (var file in query)
    Console.WriteLine(file);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM