2014-03-04 70 views
-1

我正在使用C#重寫一些ColdFusion代碼。使用什麼最好的數據結構?

的CF代碼看起來是這樣的:

一個數組包含由兩個部分組成的結構體:

  1. 另一個結構,它包含從數據文件中提取報頭數據。
  2. 二維數組,包含來自同一數據文件中每一行的實際數據。

在C#中,我使用Dictionary和Jagged Array。請參閱下面的代碼。這些是最好的數據結構嗎?

// Create AllDataArray that contains HeaderAndDataDict. 
     Dictionary<string, object>[] AllDataArray = new Dictionary<string, object>[1]; 

     // Create HeaderAndData Dictionary. 
     Dictionary<string, object> HeaderAndDataDict = new Dictionary<string, object>(); 

     // Add HeaderAndDataDict to AllDataArray[0]. 
     AllDataArray[0] = HeaderAndDataDict; 

     // Create Header Dictionary. 
     Dictionary<string, string> HeaderDict = new Dictionary<string, string>(); 

     // Populate Header Dictionary 
     HeaderDict.Add("Create Date", "10/20/2014"); 
     HeaderDict.Add("ABC Rank", "ALL"); 
     HeaderDict.Add("Status", "All"); 

     // Add Header Dictionary to HeaderAndDataDict. 
     HeaderAndDataDict.Add("Header", HeaderDict); 


     // Create jagged array. 
     string[][] DataJaggedArray = new string[2][]; 

     DataJaggedArray[0] = new string[] { "aaaa0", "bbbb0", "cccc0" }; 
     DataJaggedArray[1] = new string[] { "aaaa1", "bbbb1", "cccc1" }; 


     // Add DataJaggedArray to HeaderAndDataDict. 
     HeaderAndDataDict.Add("Data", DataJaggedArray); 


    // Display data. 
     for (int a = 0; a < AllDataArray.Length; a++) 
     { 
      Console.WriteLine("AllDataArray = " + a); 

      foreach (var key1 in HeaderAndDataDict.Keys) 
      { 
       Console.WriteLine("key= " + key1); 
       if (key1.Equals("Header")) 
       { 
        var valueHeader = (Dictionary<string, string>)HeaderAndDataDict[key1]; 
        foreach (var key2 in valueHeader.Keys) 
        { 
         Console.WriteLine("valueHeader= {0}= {1}", key2, valueHeader[key2]); 
        } 
       } 
       else if (key1.Equals("Data")) 
       { 
        var valueData = (string[][])HeaderAndDataDict[key1]; 

        Console.WriteLine("valueData length= " + valueData.Length); 

        for (int i = 0; i < valueData.Length; i++) 
        { 
         for (int j = 0; j < valueData[i].Length; j++) 
         { 
          Console.WriteLine("valueData= i= " + i + " j= " + j + " " + valueData[i][j]);        
         } 
        } 
       } 
      } 
     } // AllDataArray for loop 

回答

2

考慮使用object-oriented方法來保存您的數據。這意味着創建保存的頭部和數據行的類:

public class DataItem 
{ 
    private readonly Dictionary<string, string> _headers = new Dictionary<string, string>(); 
    private readonly List<string[]> _rows = new List<string[]>(); 

    public IEnumerable<string> Headers 
    { 
     get { return _headers.Keys; } 
    } 

    public void AddHeader(string key, string value) 
    { 
     _headers.Add(key, value); 
    } 

    public string GetHeader(string key) 
    { 
     return _headers[key]; 
    } 

    public string[] GetDataRow(int rowNumber) 
    { 
     return _rows[rowNumber]; 
    } 

    public void AddDataRow(string[] row) 
    { 
     _rows.Add(row); 
    } 

    public int RowCount 
    { 
     get { return _rows.Count; } 
    } 
} 

當你有這樣的基礎設施準備就緒,實際執行變得更簡單,更不容易出錯:

//add data 
List<DataItem> allData = new List<DataItem>(); 
var dataItem = new DataItem(); 
dataItem.AddHeader("Create Date", "10/20/2014"); 
dataItem.AddHeader("ABC Rank", "ALL"); 
dataItem.AddHeader("Status", "All"); 
dataItem.AddDataRow(new [] {"aaaa0", "bbbb0", "cccc0"}); 
dataItem.AddDataRow(new[] {"aaaa1", "bbbb1", "cccc1"}); 
allData.Add(dataItem); 

//display data 
foreach (var item in allData) 
{ 
    Console.WriteLine("New item:"); 
    foreach (var header in item.Headers) 
    { 
     Console.WriteLine("{0}: {1}", header, item.GetHeader(header)); 
    } 
    for (int i = 0; i < item.RowCount; i++) 
    { 
     var row = item.GetDataRow(i); 
     for (int j = 0; j < row.Length; j++) 
     { 
      Console.WriteLine("Cell ({0}, {1}): {2}", i, j, row[j]); 
     } 
    } 
} 

Additionaly,如果你喜歡對,你可以在數據項類中的打印代碼移到:

public class DataItem 
{ 
    public void Print() 
    { 
     Console.WriteLine("New item:"); 
     foreach (var header in Headers) 
     { 
      Console.WriteLine("{0}: {1}", header, GetHeader(header)); 
     } 
     for (int i = 0; i < RowCount; i++) 
     { 
      var row = GetDataRow(i); 
      for (int j = 0; j < row.Length; j++) 
      { 
       Console.WriteLine("Cell ({0}, {1}): {2}", i, j, row[j]); 
      } 
     } 
    } 
} 

然後使用它是這樣的:

//display data 
foreach (var item in allData) 
{ 
    item.Print(); 
} 

這將具有如下優點:如果您需要從程序中的其他位置打印,則可以更輕鬆地進行打印。這也可以用於其他事情,如從文本文件加載數據或將其保存回來。

更新 要使用LINQ訪問數據,這裏要說的是對行與頭過濾器的例子,然後排序由值在創建日期標題的結果。

var query = from item in allData 
      where item.GetHeader("Status") == "Status 1" 
      && item.GetHeader("ABC Rank") == "3" 
      && item.GetDataRow(1).Contains("bbbb1") 
      orderby item.GetHeader("Create Date") 
      select item; 

foreach (var item in query) 
    item.Print(); 
+0

我將使用您的建議代碼。它的確更好。你能告訴我如何使用LINQ訪問dataItem嗎? – user2142250

+0

你想用LINQ做什麼? – Bas

+0

過濾標題中的數據並過濾DataRow中的數據。 – user2142250

0

它們是有效的選擇。

我不認爲所有用法都有「最佳」解決方案 這取決於您打算如何訪問它們(讀/寫操作的數量,線程安全性等)。

+0

您能否詳細說明哪些數據結構適用於哪些要求? –

相關問題