在 C# 中比较一个 int 和多个 int 数组
Comparing an int against multiple int arrays in C#
假设我有一个名为 mapId 的整数和三个由地图编号组成的 int 数组的集合。根据用户所在的地图,将生成一个项目。对于此示例,我们可以引用三个项目:common_item
、uncommon_item
和 rare_item
。
int mapId;
int[] easyMaps = { 7, 10, 3, 44 };
int[] mediumMaps = { 17, 14, 32, 11, 79, 80, 82, 90, 111 };
int[] hardMaps = { 92, 98, 112, 145 };
我想要做的是:
如果玩家在简单地图上,生成:common_item
如果玩家在中等难度地图上,生成:uncommon_item
和 common_item
如果玩家在硬地图上,生成:rare_item
、uncommon_item
和 common_item
如果不编写三个单独的 for 循环并分别遍历三个数组,我怎么能做到这一点?有没有更好的方法来实现这种层次结构概念而不大量使用数组和循环?
您不需要手动遍历这些每个数组。你可以使用 Array.IndexOf<int>(array, value)
。此函数将 return 给定数组中值的 index
,如果不在数组中则 -1
。您可以只使用类似于此的 if 语句:
if(Array.IndexOf<int>(easyMaps, mapId) != -1){
//Spawn common_item
}
您可以在这里使用 Array.Exists 方法,如下所示:
if(Array.Exists(easyMaps, mapId)) { // common_items
// your logic
}
if(Array.Exists(mediumMaps, mapId)) { // uncommon_items
// your logic
}
if(Array.Exists(hardMaps, mapId)) { // rare_items
// your logic
}
希望这会有所帮助!!
除了其他答案,我喜欢的另一个选项是 System.Linq
命名空间,Contains。
然后你可以写:
if(easyMaps.Contains(mapId)) {
//stuff
}
我个人更喜欢它的可读性。
问题:
给定一个 mapId,获取难度级别,然后决定生成什么。
解法:
使用 Dictionary 使 link 从 mapId 到 Level,还有一个好处是在字典中查找比搜索数组更快。
代码如下:
namespace Whosebug27884119
{
public enum Level
{
Easy,
Medium,
Hard
}
class Program
{
private static Dictionary<int, Level> mapsDictionary = new Dictionary<int, Level>()
{
{7, Level.Easy}, {10, Level.Easy}, {3, Level.Easy}, {44, Level.Easy},
{17, Level.Medium}, {14, Level.Medium}, /*...*/ {111, Level.Medium},
{92, Level.Hard}, {98, Level.Hard}, {112, Level.Hard}, {145, Level.Hard},
};
static void Main(string[] args)
{
var mapId = 3;
SpawnItem(3);
}
private static void SpawnItem(int mapId)
{
Level level;
bool found = mapsDictionary.TryGetValue(mapId, out level);
if (found)
{
switch (level)
{
case Level.Easy:
// spawn common_item
break;
case Level.Medium:
// spawn common_item
// spawn uncommon_item
break;
case Level.Hard:
// spawn common_item
// spawn uncommon_item
// spawn rare_item
break;
}
}
}
}
}
PS: 我不太明白生成物品的确切含义。如果是某种行为,你可以考虑使用策略模式而不是switch case。
假设我有一个名为 mapId 的整数和三个由地图编号组成的 int 数组的集合。根据用户所在的地图,将生成一个项目。对于此示例,我们可以引用三个项目:common_item
、uncommon_item
和 rare_item
。
int mapId;
int[] easyMaps = { 7, 10, 3, 44 };
int[] mediumMaps = { 17, 14, 32, 11, 79, 80, 82, 90, 111 };
int[] hardMaps = { 92, 98, 112, 145 };
我想要做的是:
如果玩家在简单地图上,生成:common_item
如果玩家在中等难度地图上,生成:uncommon_item
和 common_item
如果玩家在硬地图上,生成:rare_item
、uncommon_item
和 common_item
如果不编写三个单独的 for 循环并分别遍历三个数组,我怎么能做到这一点?有没有更好的方法来实现这种层次结构概念而不大量使用数组和循环?
您不需要手动遍历这些每个数组。你可以使用 Array.IndexOf<int>(array, value)
。此函数将 return 给定数组中值的 index
,如果不在数组中则 -1
。您可以只使用类似于此的 if 语句:
if(Array.IndexOf<int>(easyMaps, mapId) != -1){
//Spawn common_item
}
您可以在这里使用 Array.Exists 方法,如下所示:
if(Array.Exists(easyMaps, mapId)) { // common_items
// your logic
}
if(Array.Exists(mediumMaps, mapId)) { // uncommon_items
// your logic
}
if(Array.Exists(hardMaps, mapId)) { // rare_items
// your logic
}
希望这会有所帮助!!
除了其他答案,我喜欢的另一个选项是 System.Linq
命名空间,Contains。
然后你可以写:
if(easyMaps.Contains(mapId)) {
//stuff
}
我个人更喜欢它的可读性。
问题:
给定一个 mapId,获取难度级别,然后决定生成什么。
解法:
使用 Dictionary 使 link 从 mapId 到 Level,还有一个好处是在字典中查找比搜索数组更快。
代码如下:
namespace Whosebug27884119
{
public enum Level
{
Easy,
Medium,
Hard
}
class Program
{
private static Dictionary<int, Level> mapsDictionary = new Dictionary<int, Level>()
{
{7, Level.Easy}, {10, Level.Easy}, {3, Level.Easy}, {44, Level.Easy},
{17, Level.Medium}, {14, Level.Medium}, /*...*/ {111, Level.Medium},
{92, Level.Hard}, {98, Level.Hard}, {112, Level.Hard}, {145, Level.Hard},
};
static void Main(string[] args)
{
var mapId = 3;
SpawnItem(3);
}
private static void SpawnItem(int mapId)
{
Level level;
bool found = mapsDictionary.TryGetValue(mapId, out level);
if (found)
{
switch (level)
{
case Level.Easy:
// spawn common_item
break;
case Level.Medium:
// spawn common_item
// spawn uncommon_item
break;
case Level.Hard:
// spawn common_item
// spawn uncommon_item
// spawn rare_item
break;
}
}
}
}
}
PS: 我不太明白生成物品的确切含义。如果是某种行为,你可以考虑使用策略模式而不是switch case。