我需要得到一个2D数组的元素,其中有一个bool为真。 这是唯一一个有这个布尔值的人。
public void getCurrentTile()
{
for (int x = 0; x < 75; x++)
{
for (int y = 0; y < 75; y++)
{
if (((Tile)grid[y, x]).lit)
{
current = (Tile)grid[y, x];
}
}
}
}
这是我目前的代码。它似乎无法正常工作。它仅在一个瓷砖点亮时返回电流。当另一个图块亮起时,它不会返回图块。
瓷砖代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace SimMedieval
{
public class Tile
{
public int size;
public String path;
public Texture2D texture;
public bool lit = false;
public bool lightable;
MouseState mouseState;
public System.Drawing.Color color;
public int posX;
public int posY;
public Tile(int s, String texturepath, bool light)
{
size = s;
path = texturepath;
lightable = light;
}
public void load(Game game, Game1 game1, System.Drawing.Color colour)
{
color = colour;
texture = game.Content.Load<Texture2D>(path);
game1.tiles.Add(this);
}
public void render(SpriteBatch sprites,int x, int y, Camera cam, Tile[,] grid)
{
mouseState = Mouse.GetState();
float camPosX = (x * size) + cam.posX;
float camPosY = (y * size) + cam.posY;
if (-20 < camPosX && camPosX < 960 && -20 < camPosY && camPosY < 640)
{
if (new Microsoft.Xna.Framework.Rectangle(x, y, 1, 1).Contains((mouseState.X / size) - ((int)Math.Round(cam.posX) / size), (mouseState.Y / size) - ((int)Math.Round(cam.posY) / size)))
{
lit = true;
grid[y, x] = this;
sprites.Draw(texture, new Vector2((x * size) + cam.posX, (y * size) + cam.posY), Microsoft.Xna.Framework.Color.Coral);
}
else
{
lit = false;
grid[y, x] = this;
sprites.Draw(texture, new Vector2((x * size) + cam.posX, (y * size) + cam.posY), Microsoft.Xna.Framework.Color.White);
}
}
}
public void spawn(int x, int y, Tile[,] grid)
{
grid[y, x] = this;
posX = x;
posY = y;
}
}
}
答案 0 :(得分:2)
我应该这样做,我想:
public Tile getCurrentTile()
{
for (int x = 0; x < 75; x++)
for (int y = 0; y < 75; y++)
if (((Tile)grid[y, x]).lit)
return (Tile)grid[y, x];
return null; // Return null if not found.
}
不是在搜索功能中设置current
,而是让它返回找到的项目更清楚,或者null
如果无法找到它。
然后你的调用代码看起来更像是这样:
var item = getCurrentTile();
if (item != null)
current = item;
else
// Code to handle no current tile being found.
或者(更简单)你可以使用Linq:
Tile item = grid.Cast<Tile>().FirstOrDefault(cell => cell.lit);
if (item != null)
current = item;
else
// Code to handle no current tile being found.
这很有效,因为它会在找到第一个项目后立即停止迭代。
如果您想要发现异常,请执行以下操作:
Tile item = grid.Cast<Tile>().First(cell => cell.lit);
一旦找到项目,这也将停止迭代。这是我使用的,因为它是最有效的,它还表达了其中一个必须匹配谓词的想法。这意味着您知道返回的item
将永远不会为null - 但是,如果元素的 none 与谓词匹配,它当然会抛出异常。
但是,如果你想在没有找到或多于一个的情况下抛出异常,你可以这样做:
Tile item = grid.Cast<Tile>().Single(cell => cell.lit);
这将始终遍历所有元素,因为它是检查多个元素是否与谓词匹配的唯一方法。
答案 1 :(得分:0)
您可以使用Linq查找所需的项目。但首先你需要将2D数组转换为IEnumerable<T>
但是如何?如果您的grid
包含Tile
的对象,请尝试以下简单的一行解决方案。
Tile current= (from Tile item in array
where item!=null && item.lit select item).FirstOrDefault();