2013-08-25 23 views
0

如果我知道數據文件的大小,我可以輕鬆地將數據文件傳遞給二維數組,但是當您想要添加和刪除數據時,這非常沒有意義。C#如何將未知行數據的文本文件解析爲2D數組?

我怎樣才能實例化一個數據行長度是全局的,而不是超出範圍的程序的剩餘部分的二維數組?

以下是通常的代碼,對於4行6列的數組,但我想向數據文件添加/刪除數據,使其在行中未知長度。

string[,] allStudentData = new string[4, 6]; 
      string[] allStudents = File.ReadAllLines("data.txt"); 


      for (int i = 0; i < allStudents.Count(); i++) 
      { 
       for (int j = 0; j < 6; j++) 
       { 

        string[] DataIn = allStudents[i].Split(','); 

        allStudentData[i, j] = DataIn[j]; 
       } 
      } 

感謝您的想法:-)

回答

2

爲什麼不使用的東西變的,就像一個列表?

您可以添加使用。新增()命令,列,並且可以摺疊成一個數組當你與它(.ToArray())

+0

但是把它變成'2D array',我們需要更多的代碼(只是'ToArray()')。 –

+0

如果你有一個列表不會把它變成一個字符串[] []如果你.ToArray()呢? – Haedrian

+0

當然,如果這是OP想要的,如果他仍然想繼續使用'[,]'(方陣)而不是'之字形數組',那麼仍然需要更多的代碼。但是他應該使用'List'來代替(不需要轉換成任何類型的數組)。 –

1

您可以使用擁有一個List做自定義對象(也可能是一個數組),而不是數組,然後在最後的列表轉換爲一個數組與ToArray的擴展:

var list = new List<string[]>(); 
var data1 = new string[2] {"1", "2" }; 
var data2 = new string[3] {"1", "2", "3" }; 
list.Add(data1); 
list.Add(data2); 
list.ToArray(); // converts the list to string[][] 

你讀完該文件後,你可以輕鬆添加更多的項目到列表,然後在最後寫入文件的所有修改。如果你認爲,在未來,你將需要比二維數組,多於它的價值來創造這樣一個自定義對象:

public class Student 
{ 
    public string Name { get; set; } 
    public int Grade { get; set; } 
} 

,並使用此而不是字符串[]:

var studentData = new List<Student>(); 

以後的維護將更容易(添加地址,類別等)。我承認,在閱讀和寫作時你會有更多的工作要做,但是如果項目增長的話,它會得到回報。

,您仍然可以使用LINQ讀取一行數據:

// creates a List<Student> 
var studentData = File.ReadAllLines("data.txt") 
         .Select(row => row.Split(',')) 
         .Select(elements => 
          new Student 
          { 
           Name = elements[0], 
           Grade = int.Parse(elements[1]) 
          }).ToList(); 
1

如果列數始終是6,只有行數是未知的。只是改變了前兩排你的代碼到:

string[] allStudents = File.ReadAllLines("data.txt"); 
string[,] allStudentData = new string[allStudents.Count(), 6]; 

如果列數是未知的,你可以做到這一點得到2D結果

var not2DResult = File.ReadAllLines("data.txt").Select(x => x.Split(',')).ToArray(); 

var maxRow = not2DResult.Count()-1; 
int maxColumn = Enumerable.Select(not2DResult, c => c.Count()).Max()-1; 

var result2D = new string[maxRow, maxColumn]; 
for (int rowNumber = 0; rowNumber < maxRow; rowNumber++) 
{ 
    var row = not2DResult[rowNumber]; 
    for (int columnNumber = 0; columnNumber < row.Count(); columnNumber++) 
    { 
     result2D[rowNumber, columnNumber] = row[columnNumber]; 
    } 
} 
+0

謝謝你,我原以爲它會超出範圍,如果我在一個方法中創建它,但它也在表單構造器中運行,我可以通過該程序使用它。 – netchicken

+0

@netchicken我添加了一個解決方案,生成一個二維數組,您可以在列數未知的情況下使用。 –

1

你可以做以下

var result = File.ReadAllLines("data.txt").Select(x=>x.Split(',')).ToArray(); 
+0

Oooohhhhh !!!!我喜歡它! Lambda岩石! – netchicken

+0

@Damith這是一個美麗的解決方案,但它不會產生二維數組,但會產生一個包含數組的數組。 –

0

嘗試使用列表來保存文件信息。

var myList = new List<string>(); 
myList = File.ReadLines("data.txt"); 
var my2DList = new List<List<string>>(); 

foreach(string line in myList) 
    my2DList.Add(line.Split(',')); 

如果你想知道的行數,只需使用:

int numberOfLines = my2DList.Count; 

對於項目中的個別行數:

int lengthOfLine3 = my2DList[3].Length;