我有一个任务来从文本文件中读取文本。文本是一个库存,其中包含部门名称,其次是部门中的物料数量,然后是具有物料名称,数量和价格的单独部门下的物料。该文本文件的一部分如下所示: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