c#中的集合
本文关键字:集合 | 更新日期: 2023-09-27 18:10:08
我有我的数据存储在string[]
数据,但我想做一个集合相同的。但是当我递归调用我的函数时,它删除了我的旧集合,因为我在里面调用它。你能告诉我怎么做正确吗?我如何使用这些数据存储从我的主类?
/* 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;
}
在全局级别的方法外声明列表对象。
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;
}
抱歉晚了回复:(