2016-01-07 39 views
1

我有文件C#添加一個數組或列到名單

public class Document 
{ 
    public string[] fullFilePath; 
    public bool isPatch; 
    public string destPath; 


    public Document() { } 

    public Document(string[] fullFilePath, bool isPatch, string destPath) 
    { 
     this.fullFilePath = fullFilePath; 
     this.isPatch = isPatch; 
     this.destPath = destPath; 
    } 

的fullFilepath的名單應列表或路徑的數組。

例如:

Document 1 
---> C:\1.pdf 
---> C:\2.pdf 

Document 2 
---> C:\1.pdf 
---> C:\2.pdf 
---> C:\3.pdf 

我的問題,如果我使用一個字符串數組中的所有文檔的fullFilePath了「空」。 如果我爲fullFilePath使用列表,則所有文檔都從最後一個文檔獲取相同的條目。

這裏是如何的列表填充:

  int docCount = -1; 
      int i = 0; 


      List<Document> Documents = new List<Document>(); 
      string[] sourceFiles = new string[1]; 

      foreach (string file in filesCollected) 
      { 
       string bc; 
       string bcValue; 


       if (Settings.Default.barcodeEngine == "Leadtools") 
       { 
        bc = BarcodeReader.ReadBarcodeSymbology(file); 
        bcValue = "PatchCode"; 
       } 
       else 
       { 
        bc = BarcodeReader.ReadBacrodes(file); 
        bcValue = "009"; 
       } 
       if (bc == bcValue) 
       { 
        if(Documents.Count > 0) 
        { 
         Array.Clear(sourceFiles, 0, sourceFiles.Length); 
         Array.Resize<string>(ref sourceFiles, 1); 
         i = 0; 
        } 
        sourceFiles[i] = file ; 
        i++; 
        Array.Resize<string>(ref sourceFiles, i + 1); 

        Documents.Add(new Document(sourceFiles, true,"")); 
        docCount++; 


       } 
       else 
       { 
        if (Documents.Count > 0) 
        { 
         sourceFiles[i] = file; 
         i++; 
         Array.Resize<string>(ref sourceFiles, i + 1); 

         Documents[docCount].fullFilePath = sourceFiles; 
        } 
       }     
      } 
+0

您正在爲每個文檔使用相同的源文件實例。你總是得到相同的數據是正常的。您放入數組的最後一組 – Steve

+0

既然您正在調整它的大小,爲什麼在這裏甚至使用'Array'? – crashmstr

回答

2

您正在爲每個文檔使用相同的數組實例。該實例在每個內部循環中都會更新一個新的文件列表,但是數組是對內存區域的引用(我知道過分簡化,但爲了達到此答案的目的就足夠了),並且如果更改了該區域的內容的內存,你正在改變它的每一個文件。

您需要爲添加到文檔列表中的每個新文檔創建源文件的新實例。此外,如果不確定要包含在數組中的元素的數量,使用泛型列表並刪除處理數組大小調整的所有代碼會更好。

首先更改類定義

public class Document 
{ 
    public List<string> fullFilePath; 
    public bool isPatch; 
    public string destPath; 


    public Document() { } 

    public Document(List<string> fullFilePath, bool isPatch, string destPath) 
    { 
     this.fullFilePath = fullFilePath; 
     this.isPatch = isPatch; 
     this.destPath = destPath; 
    } 
} 

現在改變你的內循環,以

foreach (string file in filesCollected) 
{ 
    string bc; 
    string bcValue; 
    .... 
    if (bc == bcValue) 
    { 
     List<string> files = new List<string>(); 
     files.Add(file); 
     Documents.Add(new Document(files, true, "")); 
     docCount++; 
    } 
    else 
     Documents[docCount].fullFilePath.Add(file); 
} 

注意,當你需要添加新的文件我建立一個新的List<string>,添加當前文件並在構造函數中傳遞所有內容(實際上,這應該直接在Document類的構造函數中移動)。當您要添加只是一個新的文件,你可以在你直接將它添加到公共fullFilePath財產

移動文件的處理內部文檔類可以被改寫爲

public class Document 
{ 
    public List<string> fullFilePath; 
    public bool isPatch; 
    public string destPath; 

    public Document() 
    { 
     // Every constructory initializes internally the List 
     fullFilePath = new List<string>(); 
    } 

    public Document(string aFile, bool isPatch, string destPath) 
    { 
     // Every constructory initializes internally the List 
     fullFilePath = new List<string>(); 
     this.fullFilePath.Add(aFile); 
     this.isPatch = isPatch; 
     this.destPath = destPath; 
    } 
    public void AddFile(string aFile) 
    { 
     this.fullFilePath.Add(aFile); 
    } 
} 

當然,現在調用代碼只傳遞新文件或調用AddFile,而不需要檢查列表初始化。

+1

我投票支持你!列表更加動態,比數組更好:-) – erikscandola

+0

謝謝,這是工作完美。 – user1073472

1

問題應該在這裏:

string[] sourceFiles = new string[1]; 

如果移動這條線在你的foreach代碼,你應該,因爲在解決這個問題您你總是使用相同的變量,所以相同的參考。

int docCount = -1; 
int i = 0; 

List<Document> Documents = new List<Document>(); 

foreach (string file in filesCollected) 
{ 
    string[] sourceFiles = new string[1]; 
    string bc; 
    string bcValue; 

    if (Settings.Default.barcodeEngine == "Leadtools") 
    { 
     bc = BarcodeReader.ReadBarcodeSymbology(file); 
     bcValue = "PatchCode"; 
    } 
    else 
    { 
     bc = BarcodeReader.ReadBacrodes(file); 
     bcValue = "009"; 
    } 
    if (bc == bcValue) 
    { 
     if(Documents.Count > 0) 
     { 
      Array.Clear(sourceFiles, 0, sourceFiles.Length); 
      Array.Resize<string>(ref sourceFiles, 1); 
      i = 0; 
     } 
     sourceFiles[i] = file ; 
     i++; 
     Array.Resize<string>(ref sourceFiles, i + 1); 

     Documents.Add(new Document(sourceFiles, true,"")); 
     docCount++; 
    } 
    else 
    { 
     if (Documents.Count > 0) 
     { 
      sourceFiles[i] = file; 
      i++; 
      Array.Resize<string>(ref sourceFiles, i + 1); 

      Documents[docCount].fullFilePath = sourceFiles; 
     } 
    }     
}