首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#中的集合

c#中的集合
EN

Stack Overflow用户
提问于 2014-06-25 17:16:57
回答 3查看 78关注 0票数 1

我将数据存储在string[]数据中,但我想对集合执行同样的操作。但是当我在函数上进行递归调用时,它会删除我的旧集合,因为我在里面调用了它。你能告诉我怎么做才对吗?我如何使用存储在主类中的这些数据呢?

编辑2:现在我的代码完美了,谢谢!

/* CLASS DONNEES */

代码语言:javascript
复制
class Donnees
{
    public string NomFichier { get; set; }
    public string Repertoire { get; set; }
    public string Chemin { get; set; }
}

在我的MAIN.CS中/*呼叫*/

代码语言:javascript
复制
 class Program
 {

    static void Main(string[] args)
    {
        var DonneesMain = new List<Donnees>();

       /* ********
       ***MY CODE*
       ******** */
       DonneesMain.AddRange(CreerCollectionDonnees(path, DonneesMain));

        foreach (Donnees Data in DonneesMain)
        {
            System.IO.File.AppendAllText(@"D:\fichier.txt", Data.NomFichier + Environment.NewLine);
            i++;
        }



        Console.WriteLine(i);

/* /我的邪恶方法/ */

代码语言:javascript
复制
public static List<Donnees> CreerCollectionDonnees(string path, List<Donnees> M)
    //public static void CreerCollectionDonnees(string path)
    {
        //var lesDonnees = new List<Donnees>();
        List<Donnees> lesDonnees = M;

        try
        {
            if ((File.GetAttributes(path) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
            {
                //string[] fichiers = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
                foreach (string fichier in Directory.GetDirectories(path))
                {
                    //On choisi de ne pas récuperer les données des fichiers commençant par $
                    //if (Path.GetFileName(fichier).Substring(0, 1) != "$")

                        lesDonnees.Add(new Donnees { NomFichier = Path.GetFileName(fichier), Repertoire = Path.GetDirectoryName(fichier), Chemin = Path.GetPathRoot(fichier) });
                        //Console.WriteLine("{0} {1}  ", new string(' ', indent), Path.GetFileName(fichier));
                        CreerCollectionDonnees(fichier, lesDonnees);
                }
            }
        }
        catch (UnauthorizedAccessException) { }

        return lesDonnees;
    }
EN

回答 3

Stack Overflow用户

发布于 2014-06-25 17:22:37

在你的方法ex之外声明列表对象。在全球范围内。

代码语言:javascript
复制
   public List<Donnees> lesDonnees = new List<Donnees>();

然后你可以从你的主类访问它。

更新:这是因为你还在添加range lesDonnees.AddRange(CreerCollectionDonnees(fichier));,这实际上并不是必需的。

根据查询更新答案。

代码语言:javascript
复制
internal class Program
 {
       private List<Donnees> lesDonnees = new List<Donnees>();
       public static void Main(string[] args)
        {
            Program program = new Program();
            var result  = program.CreerCollectionDonnees(@"C:\YOURPATH");
            // Loop through the collection received in 'result' variable
        }

        private List<Donnees> CreerCollectionDonnees(string path)
        {
            try
            {
                if ((File.GetAttributes(path) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
                {
                    //string[] fichiers = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
                    foreach (string fichier in Directory.GetDirectories(path))
                    {
                        lesDonnees.Add(new Donnees { NomFichier = Path.GetFileName(fichier), Repertoire = Path.GetDirectoryName(fichier), Chemin = Path.GetPathRoot(fichier) });
                        //Console.WriteLine("{0} {1}  ", new string(' ', indent), Path.GetFileName(fichier));
                        CreerCollectionDonnees(fichier);
                    }
                }
            }
            catch (UnauthorizedAccessException) { }
            return lesDonnees;
        }
}
票数 1
EN

Stack Overflow用户

发布于 2014-06-25 17:27:13

您代码中的问题是:当您调用CreerCollectionDonnees时,每次程序都会通过指令var lesDonnees = new List<Donnees>();创建一个新的列表。创建一个新的空列表,它会覆盖列表的最后一个内容!因此,您必须在 CreerCollectionDonnees方法外部声明lesDonnees列表

希望我能帮到你!编辑:您已经正确地在方法外部声明了lesDonnees,但是您的错误是在方法内部声明了另一个时间lesDonnees,请注意:

代码语言:javascript
复制
private static List<Donnees> CreerCollectionDonnees(string path){

   Var lesDonnees = new List<Donnees>();

    try
    {
        if ((File.GetAttributes(path) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
        {
            //string[] fichiers = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
            foreach (string fichier in Directory.GetDirectories(path))
            {
                lesDonnees.Add(new Donnees { NomFichier = Path.GetFileName(fichier), Repertoire = Path.GetDirectoryName(fichier), Chemin = Path.GetPathRoot(fichier) });
                //Console.WriteLine("{0} {1}  ", new string(' ', indent), Path.GetFileName(fichier));
                lesDonnees.AddRange(CreerCollectionDonnees(fichier));
                CreerCollectionDonnees(fichier);
            }
        }
    }
    catch (UnauthorizedAccessException) { }
    return lesDonnees;

每次调用它时,它都会重新声明lesDonnees列表,这样它就会删除之前的内容!正确的代码如下:

私有静态列表CreerCollectionDonnees(字符串路径){

代码语言:javascript
复制
    //DO NOT declare lesDonnees!
    try
    {
        if ((File.GetAttributes(path) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
        {
            //string[] fichiers = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
            foreach (string fichier in Directory.GetDirectories(path))
            {
                lesDonnees.Add(new Donnees { NomFichier = Path.GetFileName(fichier), Repertoire = Path.GetDirectoryName(fichier), Chemin = Path.GetPathRoot(fichier) });
                //Console.WriteLine("{0} {1}  ", new string(' ', indent), Path.GetFileName(fichier));
                lesDonnees.AddRange(CreerCollectionDonnees(fichier));
                CreerCollectionDonnees(fichier);
            }
        }
    }
    catch (UnauthorizedAccessException) { }
    return lesDonnees;

}

很抱歉回复晚了:(

票数 0
EN

Stack Overflow用户

发布于 2014-06-25 17:28:21

这个集合并没有被删除,您只是为每个方法调用创建了一个新的集合,所以您看不到在下面级别创建的集合。

你可以从方法中返回列表,这样当你调用它时,你就可以得到列表,而且递归调用也可以从内部级别获得结果:

代码语言:javascript
复制
private static List<Donnees> CreerCollectionDonnees(string path) {
  var lesDonnees = new List<Donnees>();

  if ((File.GetAttributes(path) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint) {
    foreach (string fichier in Directory.GetDirectories(path)) {
      lesDonnees.Add(new Donnees { NomFichier = Path.GetFileName(fichier), Repertoire = Path.GetDirectoryName(fichier), Chemin = Path.GetPathRoot(fichier) });    
      lesDonnees.AddRange(CreerCollectionDonnees(fichier));
    }
  }
  return lesDonnees;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24404702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档