2016-10-04 47 views
0

我有零件的枚舉列表中的特定位置的內容:試圖告訴枚舉字符是在一個字符串

public enum Parts 
{ 
    Wall = (int)'#', 
    Empty = (int)'-', 
    Player = (int)'@', 
    Goal = (int)'.', 
    Block = (int)'$', 
    BlockOnGoal = (int)'*', 
    PlayerOnGoal = (int)'+' 
}; 

而且我有一個字符串

string Level = "####\n# #\n#@ #\n####"; 

所以所有的項目中字符串是在枚舉列表 如果我再調用函數

public Parts WhatsAt(int row, int column) 
    { 
     return Parts.Wall;// Teachers comment but idk what he means "WRONG - but now no exception! should look up Level or some better data structure" 
    } 

所以當調用該函數將將字符串拆分爲\ n,然後將輸入用作地圖上的座標來精確定位其中的特定字符。
左上方行:0,列:0
右下側排:4,列:4

#### 
# # 
#@ # 
#### 

我如何再使函數返回什麼部件名稱是在指定給座標。

例如

Parts actual = WhatsAt(0, 2); 

實際然後會成爲華爾街的那是什麼#中的枚舉意味着


感謝所有幫助提前

+0

那麼,一旦你有一個字符(採用分體式,[]和子),你*會*投你的性格爲int,並然後將其轉換爲您的枚舉類型,但這將是一個黑客(因爲您假設枚舉值等於字符值)。一個更好的數據結構將是一個'Dictionary '將字符映射到零件。 –

回答

1

如果我有你的權利,你可以試試這個:

public static Parts WhatsAt(int row, int column) 
{ 
    var rows = Level.Split('\n'); 
    return (Parts)rows[row][column]; 
} 
+1

有了學校相關的問題,最好是解釋答案,而不是僅僅爲學生做作業。最好編寫最簡單,最有效的代碼。即當一個簡單的索引器足以滿足時,不使用LINQ的'ElementAt()'方法,而當可以直接轉換爲所討論的'enum'類型時,不會將中間轉換爲'int'。 –

+0

你的技術細節是正確的。 –

+0

是的,我認爲該會徽是不是問題只是沒有返回它作爲一個枚舉「(部分)」類型 – 1seanr

0

你試過什麼東西?如果你無法做出足夠的努力去編寫代碼,那麼與老師討論會更好,因爲這意味着你錯過了一些他正試圖傳達的重要概念。

其間:

實際上有兩個部分組成(至少)你的問題:

  1. 如何找到一個給定rowcolumnchar值。
  2. 如何將char值轉換爲Parts枚舉值。 (另外:除非enum具有[Flags]屬性,這是一個.NET編碼習慣使enum類型名稱單數,而不是複數,並且此慣例是恕我直言有用的。因此Part將是您的enum類型更好的名稱比Parts)。

關於第一點,你似乎已經意識到,你可以使用string.Split()方法從原始獲得string值的數組:

string[] rows = Level.Split('\n'); 

你可以索引此數組與row變量傳入以獲取該行的正確值string值。內string值,然後可以用戶column變量索引爲位置所需char值:

char location = rows[row][column]; 

關於第二點,轉換回Parts類型是一個簡單的轉換:

Parts part = (Parts)location; 

這不會更改正在使用的實際值,而是會將location值重新解釋爲存儲在part變量中的Parts值。

因此,您應該擁有編寫您的WhatsAt()方法所需的一切。上述所有,如果你喜歡,甚至可以表示爲一個單一的表達:

(Parts)Level.Split('\n')[row][column] 
+0

我的問題是「我如何使該函數返回零件名稱是在指定的捐助公司-ordinate「。這只是代碼的最後一行,謝謝 – 1seanr

+0

我之前做了很多事情,但都沒有工作,所以我選擇不將它包含在該示例中,因爲它會不必要地使其複雜化,並且很可能使試圖幫助的人感到困惑。 – 1seanr