我有一个从文本文件中读取文本的作业。该文本是一个库存,其中包含部门名称,后跟部门中的项目数量,然后是具有项目名称,数量和价格的单独部门下面的项目。文本文件的一部分如下所示:
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 :(得分:0)
从文本文件中读取的方法会导致您拥有List<Dept>
。因此,您可以通过浏览从文本文件中读取的部门列表来生成有效部门名称列表。
答案 1 :(得分: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
答案 2 :(得分: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);
}
}
}