2017-03-16 65 views
0

我需要導入額外列表(醬料來與一頓飯)和他們各自的價格。用老師的一些代碼,我可以讀取文件,將額外的名字和價格放入一個列表中,然後顯示它以顯示它已經工作。現在的問題是,當我必須按字母順序排列額外字符時,才能對其應用二進制搜索。我用.sort和OrderBy等嘗試了一切,但沒有任何工作。與數據將兩列數據讀入一個列表中,按字母順序排序

鷹嘴豆泥,0.75
辣椒,0.50
Tabouli,1.25
Tzatziki

我的外部文本文件,0.50

額外

Public Class extra 
    Public Property Name As String 
    Public Property Price As Decimal 
End Class 
公共類

此代碼導入數據,並將其放入一個列表

Dim allExtras = From line In System.IO.File.ReadLines("C:\Users\ExtrasList.txt") 
       Let Columns = line.Split(","c) 
       Where Columns.Length = 2 
       Let Price = Decimal.Parse(Columns(1).Trim()) 
       Let Name = Columns(0).Trim() 
       Select New extra With {.Name = Name, .Price = Price} 

Dim extraList As List(Of extra) = allExtras.ToList() 

顯示列表

Console.WriteLine() 
Console.WriteLine("Extra Name" & vbTab & "Price") 
Console.WriteLine("-----------" & vbTab & "-----") 
For Each extra In extraList 
    Console.WriteLine(extra.Name & vbTab & vbTab & extra.Price) 
Next 

我只需要得到一個單獨的文件中的演員和他們的價格到一個數組或列表,可以按字母順序排序,以便用戶可以搜索以查看他們想要的額外內容是否存在。我還需要能夠訪問該列表,以便用戶可以選擇並額外購買,然後將所需價格添加到總價中。任何幫助將不勝感激,因爲這部分是阻止我進一步深入。我不介意如果有人能夠幫助我用現有的代碼對列表進行排序,或者讓我更有效地將文件中的數據讀入列表,我只需要某種解決方案。

+0

實例在你的代碼沒有簡化您的閱讀方法試圖排序或'OrderBy'。 'OrderBy'應該可以工作。如果您嘗試使用'OrderBy',那麼您的意思是「它不工作」? – Fabio

回答

0
Imports System.Linq 
. . . . . . 
' I think, this is cleaner way to load list 
Dim eList as List(Of Extra) = File.ReadAllLines("C:\Users\ExtrasList.txt"). 
    Select(
     Function(l) 
      Dim a() As = l.Split(",".ToCharArray()) 
      Return New Extra With { .Name = a[0].Trim(), .Price = Decimal.Parse(a(1).Trim()) } 
     End Function).ToList() 


...... 
' Check if extra exists. Optionally, you can use string comparison options 
If (eList.Any(Function(i) String.Equals(i.Name, "The Name")) Then 

...... 
' get price of specific extra 
Dim price As Decimal = eList.Single(Function(i) String.Equals(i.Name, "The Name")).Price 
0

按名稱搜索和通過名稱獲得價格最有效的方法,是把名字和相應的價格向Dictionary

Dim sauces = File.ReadAllLines("C:\Users\ExtrasList.txt"). 
        Select(Function(line) line.Split(",")). 
        ToDictionary(Function(pair) pair(0), Function(pair) pair(1)) 

然後你可以使用它

Dim price As String 
If sauces.TryGetValue("Hummus", price) = True Then 
    ' Use price 
Else 
    ' Show not found message 
End If 

對於上市你可以遍歷所有的價值 - 鑰匙對

Dim orderedPairs = sauces.OrderBy(Function(pair) pair.Key) 
For Each sauce As KeyValuePair(Of String, String) In orderedPairs 
    Dim name = sauce.Key 
    Dim price = sauce.Value 
Next 

我建議創建醬自己的類相應品種

Public Class Sauce 
    Public Property Name As String 
    Public Property Price As Decimal 
End Class 

然後你就可以通過引入自己的方法轉換線的Sauce

Public Function LineToSauce(line As String) As Sauce 
    Dim pair As String() = line.Split(",") 
    Return New Sauce With 
    { 
     .Name = pair(0), 
     .Price = Decimal.Parse(pair(1)) 
    } 
End Function 

' Reading 
Dim sauces = File.ReadAllLines("C:\Users\ExtrasList.txt"). 
        Select(AddressOf LineToSauce). 
        ToDictionary(Function(sauce) sauce.Name) 

' searching by name 
Dim sauce As Sauce 
If sauces.TryGetValue("Hummus", sauce) = True Then 
    ' Use sauce.Price or sauce.Name 
Else 
    ' Show not found message 
End If 

' iterating and ordering 
Dim orderedSauces = sauces.Values.OrderBy(Function(sauce) sauce.Name) 
For Each sauce As orderedSauces 
    Dim name = sauce.Name 
    Dim price = sauce.Price 
Next