c#中的集合

本文关键字:集合 | 更新日期: 2023-09-27 18:10:08

我有我的数据存储在string[]数据,但我想做一个集合相同的。但是当我递归调用我的函数时,它删除了我的旧集合,因为我在里面调用它。你能告诉我怎么做正确吗?我如何使用这些数据存储从我的主类?

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

/* CLASS DONNEES */

class Donnees
{
    public string NomFichier { get; set; }
    public string Repertoire { get; set; }
    public string Chemin { get; set; }
}

/* MY MAIN.CS中的调用*/

 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);

/*///////////MY EVIL METHOD/////*/

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;
    }

c#中的集合

在全局级别的方法外声明列表对象。

   public List<Donnees> lesDonnees = new List<Donnees>();

,那么你可以从你的Main类访问它。

更新:这是因为你还在加范围lesDonnees.AddRange(CreerCollectionDonnees(fichier));这实际上是不需要的。

根据查询更新答案。

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;
        }
}

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

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

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;
}

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

希望我对你有所帮助!编辑:你已经在方法外正确地声明了lesDonnees,但是你的错误是在方法内另一次声明 lesDonnees,注意:

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列表,因此它会删除之前的内容!正确的代码如下:

private static List CreerCollectionDonnees(string path){

    //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;

}

抱歉晚了回复:(