2

重複の可能性:
List<T>の2つのアイテムを交換します

編集:たぶん、これは「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;

在庫と呼ばれるリスト<アイテム>を作成しました。だから今私はこのようなスワップ関数を実装したいと思います:

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メソッドを持っていません。

メソッドに渡す引数を、交換したいアイテムに関連付けたいと思います。したがって、最初のアイテムはマウスで選択したアイテムになり、他のアイテムは最初のアイテムが交差しているアイテムになります。

4

2 に答える 2

21

リストの要素を交換するには、拡張メソッドを次のように記述します。

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
于 2012-07-01T15:15:40.783 に答える
0

2つの変数の値を交換するには、参照を使用するのが最も簡単な方法です。これは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;
}

使用されるアルゴリズムは非常に単純で、説明は通常次のように行われます。グラスが2つあり、1つは水、もう1つはオイルです。最初のグラスに油を入れるには、3番目のグラスを使用し、中に水を入れてから、最初のグラスに油を入れ、2番目のグラスに水を入れる必要があります。


これが私が考えていたものです。コメントを探して、何が起こっているのかを理解できるようにします。

// 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])
    }
}
于 2012-07-01T15:07:16.220 に答える