我将数据存储在string[]数据中,但我想对集合执行同样的操作。但是当我在函数上进行递归调用时,它会删除我的旧集合,因为我在里面调用了它。你能告诉我怎么做才对吗?我如何使用存储在主类中的这些数据呢?
编辑2:现在我的代码完美了,谢谢!
/* CLASS DONNEES */
class Donnees
{
public string NomFichier { get; set; }
public string Repertoire { get; set; }
public string Chemin { get; set; }
}在我的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);/* /我的邪恶方法/ */
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;
}发布于 2014-06-25 17:22:37
在你的方法ex之外声明列表对象。在全球范围内。
public List<Donnees> lesDonnees = new List<Donnees>();然后你可以从你的主类访问它。
更新:这是因为你还在添加range 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;
}
}发布于 2014-06-25 17:27:13
您代码中的问题是:当您调用CreerCollectionDonnees时,每次程序都会通过指令var lesDonnees = new List<Donnees>();创建一个新的列表。创建一个新的空列表,它会覆盖列表的最后一个内容!因此,您必须在 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列表,这样它就会删除之前的内容!正确的代码如下:
私有静态列表CreerCollectionDonnees(字符串路径){
//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;}
很抱歉回复晚了:(
发布于 2014-06-25 17:28:21
这个集合并没有被删除,您只是为每个方法调用创建了一个新的集合,所以您看不到在下面级别创建的集合。
你可以从方法中返回列表,这样当你调用它时,你就可以得到列表,而且递归调用也可以从内部级别获得结果:
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;
}https://stackoverflow.com/questions/24404702
复制相似问题