我有一個任務來從文本文件中讀取文本。文本是一個庫存,其中包含部門名稱,其次是部門中的物料數量,然後是具有物料名稱,數量和價格的單獨部門下的物料。該文本文件的一部分如下所示: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;
}
提示:Split()之後的部門在數組中有兩個項目,而項目在該數組中有三個項目。 – jdweng
@Johnny ....在打印方法上添加一個參數名稱:用戶輸入。然後在for循環中添加if條件以檢查用戶輸入是否與您想要的部門名稱匹配......如果匹配,則打印詳細信息...否則不要部門。 Voila或者你可以使用Linq,但它有點進步(因爲我現在建議你更容易的解決方案)。 – bluetoothfx
一個建議是從'ReadDepartments'返回'IEnumerable'而不是傳遞'List'。你可以使用'AddRange(ReadDepartments())',這樣在將來讀取部門時不會限制列表。 –
Default