2016-10-04 73 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