编辑:也许这可以用于获取'b'值?
for (int i = 0; i < inventory.Count; i++)
{
if (inventory[a].ItemRectangle.Intersects(inventory[i].ItemRectangle))
{
itemB = inventory[i];
}
}
编辑:这是我的进步。
Item itemA;
Item itemB;
int a = -1;
int b = -1;
if (a != -1 && b != -1)
{
itemA = inventory[a];
itemB = inventory[b];
Swap(ref itemA, ref itemB);
inventory[a] = itemA;
inventory[b] = itemB;
}
这就是我获得“a”值的地方。
if (item.ItemSelected == true)
{
a = item.ItemIndex;
}
else
a = -1;
我还没弄明白如何获取'b'值,因为我必须检查与同一列表中的另一项冲突的项目。如果有人知道我怎么做,请告诉我。我想这看起来像这样:
if (item.ItemRectangle.Intersects(//the other item.ItemRectangle)
{
b = item.ItemIndex;
}
else
b = -1;
我做了一个List&lt;项目&gt;叫库存。所以现在我想实现一个交换函数,如下所示:
foreach (Item item in inventory)
{
if (mouseRectangle.Intersects(item.ItemRectangle))
{
if (Input.EdgeDetectLeftMouseDown())
{
switch (item.ItemSelected)
{
case false:
item.ItemSelected = true;
break;
case true:
item.ItemSelected = false;
break;
}
}
}
else if (Input.EdgeDetectLeftMouseDown())
{
switch (item.ItemSelected)
{
case true:
item.ItemSelected = false;
break;
}
}
else if (item.ItemSelected == true)
{
item.ItemPosition = new Vector2(mouseRectangle.X, mouseRectangle.Y);
item.ItemRectangle = new Rectangle(mouseRectangle.X, mouseRectangle.Y, 32, 32);
}
else if (item.ItemSelected == false && //a lot of checks to determine it is not intersecting with an equip slot
{
item.ItemPosition = item.OriginItemPosition;
item.ItemRectangle = item.OriginItemRectangle;
}
else if (item.ItemRectangle.Intersects(item.ItemRectangle))
{
//SwapItem(inventory, item, item);
}
这就是我需要帮助的代码部分。我希望列表中的任何项目都能够与列表中的任何其他项目交换。我的SwapItem方法只是一个占位符,我实际上还没有一个SwapItem方法。
我希望您传入方法的参数与我想要交换的项相关。因此,第一项是我用鼠标选择的项目,另一项应该是第一项与之交叉的项目。
答案 0 :(得分:14)
要交换列表中的元素,您可以将extension method写为。
public static class ExtensionMethods
{
public static void Swap<T>(this List<T> list, int index1, int index2)
{
T temp = list[index1];
list[index1] = list[index2];
list[index2] = temp;
}
}
请记住将扩展方法放在静态类中。
然后你可以这样做:
yourList.Swap(0,1); // swap element at index 0 with element at index 1
答案 1 :(得分:0)
要交换两个变量的值,最简单的方法是使用引用。这是c ++中的经典指针练习,但它也适用于C#。
// Replace int with any data type / class you need
void Swap (ref int a, ref int b)
{
int c = a;
a = b;
b = c;
}
使用的算法非常简单,解释通常如下:你有两个眼镜,一个有水,一个有油。要将油放入第一块玻璃杯中,您需要使用第三块玻璃杯,将水放入其中,然后将油放入第一块玻璃杯中,将水放入第二块玻璃杯中。
这是我的想法。查找评论,以便了解正在发生的事情。:
// Unlike foreach, with for I can change the values in the list
for (int i = 0; i < inventory.Count; i++)
{
if (mouseRectangle.Intersects(inventory[i].ItemRectangle))
{
if (Input.EdgeDetectLeftMouseDown())
{
// You can replace the switch with this shorter structure
// if A is a bool value, !A will have the opposite value
inventory[i].ItemSelected = !inventory[i].ItemSelected;
}
}
else if (Input.EdgeDetectLeftMouseDown())
{
// You don't need a case-switch for a single condition. An if should suffice
if (inventory[i].ItemSelected)
inventory[i].ItemSelected = false;
}
else if (inventory[i].ItemSelected == true)
{
inventory[i].ItemPosition = new Vector2(mouseRectangle.X, mouseRectangle.Y);
inventory[i].ItemRectangle = new Rectangle(mouseRectangle.X, mouseRectangle.Y, 32, 32);
}
else if (inventory[i].ItemSelected == false && //a lot of checks to determine it is not intersecting with an equip slot
{
inventory[i].ItemPosition = inventory[i].OriginItemPosition;
inventory[i].ItemRectangle = inventory[i].OriginItemRectangle;
}
// Something definitely wrong with this line, a rectangle to instersect with itself??
else if (inventory[i].ItemRectangle.Intersects(inventory[PROBABLY_SOMETHING_ELSE].ItemRectangle))
{
Swap (ref inventory[i], ref inventory[PROBABLY_SOMETHING_ELSE])
}
}