2016-04-03 114 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); 
     } 
    } 
}