2016-04-03 113 views
0

我有一個任務來從文本文件中讀取文本。文本是一個庫存,其中包含部門名稱,其次是部門中的物料數量,然後是具有物料名稱,數量和價格的單獨部門下的物料。該文本文件的一部分如下所示:C#從文件讀取

Stationary, 4 
Notebook, 20, .99 
Pens, 50, .50 
Pencils, 25, 0.09 
Post It Notes, 30, 4.99 
Tools, 6 
Band Saw, 3, 299.99 
Cresent Wrench, 12, 8.49 
Circular Saw, 5, 89.99 
Tile Cutter, 2, 149.99 
Screwdriver, 70, 2.99 
Measuring Tape, 34, 10.99 

我能夠加載文本文件中就好了。我的任務是爲用戶輸入他們想要購買的部門。 我怎樣才能夠顯示部門,然後只顯示用戶所需部門的項目?我有一個方法來輸出下面顯示的所有部門和項目。這是我第一次使用C#處理文本文件,所以我不知道我在做什麼。

static void ReadDepartments(out List<Dept> s) 
{ 
    string line; // detail line read from file 
    string[] tokens; // break line up into tokens 
    string deptName; // name of department 
    int deptQuan;  // quan of different items in dept 
    s = new List<Dept>(); 
    try 
    { 
     using (StreamReader sr = new StreamReader(@"..\..\inventory.txt")) 
     { 
      while (sr.Peek() >=0) 
      { 
       List<Item> myItemList = new List<Item>(); // new instance of tmp List 
       line = sr.ReadLine(); 
       tokens = line.Split(','); 
       deptName = tokens[0]; 
       deptQuan = Convert.ToInt32(tokens[1]); 
       for (int i=0; i< deptQuan; i++) 
       { 
        // read each line of dept and build a list of items 
        line = sr.ReadLine(); 
        tokens = line.Split(','); 
        Item myItem = new Item(tokens[0], Convert.ToInt32(tokens[1]), Convert.ToDouble(tokens[2])); 
        myItemList.Add(myItem); 
       } 
       s.Add(new Dept(deptName,deptQuan, myItemList)); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Can't open file because {0}", e.Message); 
    } 
} 

static void PrintInventory(List<Dept> s) 
{ 
    foreach (Dept d in s) 
    { 
     Console.WriteLine("Dept: {0,-20} [{1} items]", d.Name, d.NumItems); 
     for (int i = 0; i < d.NumItems; i++) 
      Console.WriteLine("  {0,-15} {1,4} {2,7:$,##0.00}", d.GetItem(i).Name, 
       d.GetItem(i).Quan, d.GetItem(i).PriceEach); 
    } 
} 

我開始檢查所需部門是否是下面顯示的有效部門的方法。 有沒有更簡單的方法來實現有效的[]變量,而不是包含所有的部門名稱?我將不得不錯誤檢查有效的項目,這似乎是非常乏味。

static string GetDepartment(string prompt) 
{ 
    string[] valid = {"BOOKS", "FOOD", "VIDEO", "SPORTS", "STATIONARY", "TOOLS"}; 
    string ans = GetString(prompt, valid, "Inavlid response. Please choose a department."); 
    return ans; 
} 

static string GetString(string prompt, string[] valid, string error) 
{ 
    string response; 
    bool OK = false; 

    do 
    { 
     Console.Write(prompt); 
     response = Console.ReadLine().ToUpper(); 
     foreach (string s in valid) if (response == s) OK = true; 
     if (!OK) Console.WriteLine(error); 
    } 
    while (!OK); 

    return response; 
} 
+0

提示:Split()之後的部門在數組中有兩個項目,而項目在該數組中有三個項目。 – jdweng

+0

@Johnny ....在打印方法上添加一個參數名稱:用戶輸入。然後在for循環中添加if條件以檢查用戶輸入是否與您想要的部門名稱匹配......如果匹配,則打印詳細信息...否則不要部門。 Voila或者你可以使用Linq,但它有點進步(因爲我現在建議你更容易的解決方案)。 – bluetoothfx

+0

一個建議是從'ReadDepartments'返回'IEnumerable '而不是傳遞'List'。你可以使用'AddRange(ReadDepartments())',這樣在將來讀取部門時不會限制列表。 – Default

回答

0

從文本文件中讀取的方法會導致您擁有List<Dept>。因此,您可以通過查看您從文本文件中讀取的部門列表來生成有效部門名稱的列表。

0

LINQ非常適合通過數據搜索並檢查項目是否存在以及不存在。 由於您擁有List中的所有部門,因此您可以通過一些不同的方法對其進行查詢。您可以搜索您的原始數據直接

using System.Linq; 
... 
List<Dept> departments; 
... 
departments.Any(dept => dept.Name == response); 

或者,如果你想將名字發送到您的GetString方法:

GetString(prompt, departments.Select(dept => dept.Name), ...); 
... 
string GetString(string prompt, IEnumerable<string> valids, string error) 
... 
valids.Any(valid => valid == response); 

如果你想使用的部門,而不是你可以使用FirstOrDefault代替(這也需要謂語),並檢查null如果該項目不存在

Department found = departments.FirstOrDefault(dept => dept.Name == response); 
if (found == null) //department name does not exist 
0

如果一切正常您的代碼,那麼你可以添加if語句以檢查是否打印您想要的部門信息。我沒有檢查整個代碼。你也可以用Linq來解決這個問題(它會更聰明的編碼),但是你的代碼在我看來是一個起始代碼,所以可能會有點低效,但我希望它能解決你的問題。

static void PrintInventory(List<Dept> s,string userInputDepartmentName) 
{ 
    if(s == null && s.Count <= 0) 
     return; 

    foreach (Dept d in s) 
    { 
     if(d.Name.Equals(userInputDepartmentName)) 
     { 
      Console.WriteLine("Dept: {0,-20} [{1} items]", d.Name, d.NumItems); 
      for (int i = 0; i < d.NumItems; i++) 
      Console.WriteLine("{0,-15} {1,4} {2,7:$,##0.00}", d.GetItem(i).Name,d.GetItem(i).Quan, d.GetItem(i).PriceEach); 
     } 
    } 
}