0

私は最近、いくつかのコードが私にとって奇妙なプロジェクト(A * algを使用する8パズルソルバー)に出くわしました。これは、そのようなものを見たことがないためです。

この行はどういう意味ですか?これは何ですか ?!

this[StateIndex]

この表記は何ですか?私はそれを完全に理解することはできません!クラスのサンプルを投稿して、ほぼすべて一緒に見ることができるようにしました。そしてもう1つの質問ですが、StateNodeのようにクラスを実装するのは間違いではありませんか?フィールドを初期化するためにコンストラクターのみを使用しましたが、最悪の場合、それらはすべてパブリックであると宣言しました。彼/彼女はこのタスクのためにプロパティを実装するべきではありませんでしたか?

public enum Direction 
{
    Up = 1, Down = 2, Left = 3, Right = 4, UpUp = 5, DownDown = 6, LeftLeft = 7, RightRight = 8, Stop = 9
}

class StateNode
{
    public int Parent;
    public List<int> Childs;
    public Direction Move;
    public Direction ParentMove;
    public byte[,] State;
    public byte Depth;
    public byte NullRow;
    public byte NullCol;
public StateNode()
{ }
public StateNode(int NewParent, Direction NewMove, Direction ParentMove, byte NewDepth, byte NewNullRow, byte NewNullCol)
{
    this.Parent = NewParent;
    this.State = new byte[5, 5];
    this.Move = NewMove;
    this.ParentMove = ParentMove;
    this.Depth = NewDepth;
    this.NullRow = NewNullRow;
    this.NullCol = NewNullCol;
    this.Childs = new List<int>();
}
}

class StateTree : List<StateNode>
{
    public static long MakedNodes;
    public static long CheckedNodes;
    public static byte MaxDepth;

    public List<int> Successor1(int StateIndex)
    {
        List<int> RetNodes = new List<int>();
        StateNode NewState = new StateNode();

        //Up
    if (this[StateIndex].NullRow + 1 <= 3 && this[StateIndex].ParentMove != Direction.Up)
    {
        NewState = ChangeItemState(this[StateIndex], StateIndex, Direction.Up, Direction.Down, Convert.ToByte(this[StateIndex].Depth + 1), this[StateIndex].NullRow, this[StateIndex].NullCol, Convert.ToByte(this[StateIndex].NullRow + 1), this[StateIndex].NullCol);

        this.Add(NewState);
        RetNodes.Add(this.Count - 1);
        StateTree.MakedNodes++;
        this[StateIndex].Childs.Add(this.Count - 1);
        if (NewState.Depth > StateTree.MaxDepth)
            StateTree.MaxDepth = NewState.Depth;

    }
    //Down
    //Left
    //Right

    return RetNodes;
}
}
4

5 に答える 5

3

具体的なケースでは、要素へのアクセスだけです。これは、から派生したクラス内で使用されるためです。List<T>

ただし、クラス オブジェクトへのインデックス アクセスを可能にするインデクサーにすることもできます。

たとえば、次のようにクラスを宣言します。

public class ListWrapper
{
    private List<int> list = ...

    public int this[int index]
    {
        return list[index];
    }
}

そして使用後は

var lw = new ListWrapper(); 
//fill it with data 

int a = lw[2]; //ACCESS WITH INDEX EVEN IF THE TYPE IS NOT COLLECTION BY ITSELF
于 2012-07-06T13:03:34.153 に答える
2

this[StateIndex]現在のクラスのインデクサープロパティを使用しています。インデクサープロパティは、コレクションまたはリストオブジェクトの要素に配列であるかのようにアクセスできるようにするものです。例えば:

List<string> strings = new List<string>();
strings.Add("Item 1");
strings.Add("Item 2");
strings.Add("Item 3");
string x = strings[0];  // Returns the first item in the list ("Item 1")

ただし、独自のクラスのインデクサープロパティにアクセスする場合は、その前にthisキーワードを付ける必要があります。この例では、StateTreeクラスがインデクサープロパティを実装していないため、混乱が生じる可能性があります。それが機能する理由は、StateTree継承List<StateNode>元がインデクサープロパティを実装しているためです。

ただし、インデクサープロパティと配列を持つクラス間で混同しないでください。構文は似ていますが、配列はまったく異なります。配列は、インデックスからアクセスできるオブジェクトのリストです。インデクサープロパティは、配列として機能する単一のオブジェクトの名前のないプロパティです。たとえば、List<string>にはインデクサープロパティがあるため、配列インデックスと同じ構文を使用して、そこに含まれるアイテムにアクセスできます(上記の例を参照)。ただし、List<string>オブジェクトの配列を作成することはできます。たとえば、次のようになります。

List<string> strings1 = new List<string>();
strings1.Add("Item 1.1");
strings1.Add("Item 1.2");

List<string> strings2 = new List<string>();
strings2.Add("Item 2.1");
strings2.Add("Item 2.2");

List<string>[] stringsArray = new List<string>[] { strings1, strings2 };
object result;
result = stringsArray[0];  // Returns strings1
result = stringsArray[0][1];  // Returns "Item 1.2"
result = stringsArray[1][0];  // Returns "Item 2.1"

これに関してStateNodeは、技術的に問題はなく、すべてのフィールド値を初期化するコンストラクターがあることも珍しくありませんが、パブリックフィールドの代わりにプロパティを使用することをお勧めします。

于 2012-07-06T13:18:33.987 に答える
2

Indexed PropertiesC# .net にあります。

チュートリアルを確認できます: http://msdn.microsoft.com/en-us/library/aa288464(v=vs.71).aspxこちらを確認してください

于 2012-07-06T13:05:37.740 に答える
1

this[StateIndex]クラス内の要素を指しています。StateTreeから継承するためList<T>、インデックスによってアクセス可能なコレクションがあります (この場合this[N]Nは要素のインデックスです。

于 2012-07-06T13:04:19.457 に答える
1

this[StateIndex] は、クラスとインデックス付きプロパティを与える方法です。

public class IndexedClass
{
  private List<String> _content;
  public IndexedClass()
  {
     _content = new List<String>();
  }
  public Add(String argValue)
  {
     _content.Add(argValue);
  }

  public string this[int index]
  {
     get
     {
        return _content[index];
     }
     set
     {
         _content[Index] = value;
     }
  }
}

だから今、あなたはすることができます

IndexedClass myIndex = new IndexedClass();
myIndex.Add("Fred");
Console.Writeline(myIndex[0]);
myIndex[0] = "Bill";
Console.Writeline(myIndex[0]);

statenode については、それがクラス (ヘルパー) に対してローカルである場合、問題ないと主張することができますが、私はそれが好きではありませんが、さらに 10 分間の作業で適切に実行できます。それが議会で公開されている場合、私の意見では受け入れられません。しかし、それは意見です。

于 2012-07-06T13:16:17.310 に答える