2014-03-04 3 views
-1

일부 ColdFusion 코드를 다시 작성하기 위해 C#을 사용하고 있습니다.사용할 수있는 최상의 데이터 구조는 무엇입니까?

CF 코드는 다음과 같다 :

  1. 다른 구조체, 데이터 파일로부터 추출 된 헤더 데이터를 포함

    어레이는 두 부분으로 구성된 구조체를 포함한다.

  2. 동일한 데이터 파일의 각 행에서 실제 데이터를 포함하는 2D 배열입니다.

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

는, 실제 구현이 간단하고하게 적은 오류가 발생하기 쉬운 : Additionaly

//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]); 
     } 
    } 
} 

, 만약 당신이 좋아하면, 당신은 데이터 항목 클래스 내에서 인쇄 코드를 움직일 수하기 :

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

어떤 데이터 구조가 어떤 요구 사항에 적합한 지 자세히 설명해 주시겠습니까? –

관련 문제