C# 消除访问多维数组元素时使用临时变量
有没有一种方法可以将数组对象的字段的坐标放在一行中 我有一个数组:C# 消除访问多维数组元素时使用临时变量,c#,arrays,multidimensional-array,point,indices,C#,Arrays,Multidimensional Array,Point,Indices,有没有一种方法可以将数组对象的字段的坐标放在一行中 我有一个数组:Tile[,]Tiles。每当我需要更改其中一个Tile并且事先知道索引时,我就这样做:tiles[1,2]=newtile(args) 但当我必须计算它们时,它看起来是这样的: Point p = GetTargetTileIndices(args); Tiles[p.X, p.Y].someField = 127; 每次在temp变量中存储tile的索引都会让人困惑,有时甚至很难读取。有没有一种方法可以将索引获取为点或其他内
Tile[,]Tiles
。每当我需要更改其中一个Tile并且事先知道索引时,我就这样做:tiles[1,2]=newtile(args)代码>
但当我必须计算它们时,它看起来是这样的:
Point p = GetTargetTileIndices(args);
Tiles[p.X, p.Y].someField = 127;
每次在temp变量中存储tile的索引都会让人困惑,有时甚至很难读取。有没有一种方法可以将索引获取为点
或其他内容,并在一行中使用目标数组元素
UPD:现在我很清楚,做
var tile = GetTile(point);
tile.field = value;
…不会更改阵列中的磁贴,但
GetTile(point).field = value;
…是的 创建一个getTargetFile
helper方法。。。就像您的getTargetId
一样,它返回实际的磁贴
而不是点
创建一个getTargetId
辅助方法。。。就像您的getTargetItemIndicates
一样,它返回实际的磁贴,而不是点
,只需编写您自己的方法:
public static class Extensions
{
public static T GetValue<T>(this T[,] array, Point point)
{
return array[point.X, point.Y];
}
public static void SetValue<T>(this T[,] array, Point point, T value)
{
array[point.X, point.Y] = value;
}
}
只需编写自己的方法:
public static class Extensions
{
public static T GetValue<T>(this T[,] array, Point point)
{
return array[point.X, point.Y];
}
public static void SetValue<T>(this T[,] array, Point point, T value)
{
array[point.X, point.Y] = value;
}
}
@DonRoby,它似乎是C#。有什么原因你不能使用字典
或字典
?@MichaelPerrenoud每个地图大约有2000万个平铺对象,我不确定任何类型的字典都比数组快,尽管我还没有检查。@user1306322,它不是更快。你的问题是关于可读性的。@MichaelPerrenoud我想当谈论基于磁贴的游戏时,必须做出一些牺牲:)@DonRoby,它看起来像是C#。有什么原因不能使用字典或字典吗?@MichaelPerrenoud每个地图大约有2000万个磁贴对象,我不确定任何类型的字典都比数组快,尽管我还没有检查。@user1306322,它并不是更快。你的问题是关于可读性的。@MichaelPerrenoud我想当谈论一个基于平铺的游戏时,必须做出一些牺牲:)我已经有了一个GetTile(Point)
和GetTile(int,int)
,它们完全按照它们的名字做,但我试图做的是在运行时设置一个tile的一些值计算地址,我不知道如何创建一个SetTilesFieldValue(Point,Field,value)
方法。字段是可变的还是静态的?我假设这是一个你在设计时不知道的领域。我不确定你想解决什么问题。。。如果您只设置一个字段,请执行GetTile(args);否则,如果您正在使用tile执行多项操作,请调用GetTile并将结果存储在一个可以参与的局部变量中。这就是局部变量的作用:)我确信当我执行GetTile(args)时,Field=Value代码>它只会更改磁贴的本地副本,但一切正常,因为在本例中,我根本不会将磁贴分配给本地变量。问题是我通常将分片存储在本地变量中,在更改后,我必须显式地将其放回数组。我已经有了一个GetTile(Point)
和GetTile(int,int)
,它们完全按照它们被调用的方式工作,但我试图做的是在运行时设置一个tile的一些值计算地址,我不知道如何创建一个SetTilesFieldValue(Point,Field,value)
方法。字段是可变的还是静态的?我假设这是一个你在设计时不知道的领域。我不确定你想解决什么问题。。。如果您只设置一个字段,请执行GetTile(args);否则,如果您正在使用tile执行多项操作,请调用GetTile并将结果存储在一个可以参与的局部变量中。这就是局部变量的作用:)我确信当我执行GetTile(args)时,Field=Value代码>它只会更改磁贴的本地副本,但一切正常,因为在本例中,我根本不会将磁贴分配给本地变量。问题是我通常将分片存储在本地变量中,在更改后,我必须显式地将其放回数组。