2011-11-14 33 views
5

tôi có mã như thế này trong C#:Chuyển đổi C# struct để F #

namespace WumpusWorld 
    { 
     class PlayerAI 
     { 
      //struct that simulates a cell in the AI replication of World Grid 
      struct cellCharacteristics 
      { 
       public int pitPercentage; 
       public int wumpusPercentage; 
       public bool isPit; 
       public bool neighborsMarked; 
       public int numTimesvisited; 
      } 

      private cellCharacteristics[,] AIGrid;     //array that simulates World Grid for the AI 
      private enum Move { Up, Down, Right, Left, Enter, Escape }; //enum that represents integers that trigger movement in WumpusWorldForm class 
      Stack<int> returnPath;          //keeps track of each move of AI to trace its path back 
      bool returntoBeg;           //flag that is triggered when AI finds gold 
      int numRandomMoves;           //keeps track of the number of random moves that are done 

      public PlayerAI() 
      { 
       AIGrid = new cellCharacteristics[5, 5]; 
       cellCharacteristics c; 
       returntoBeg = false; 
       returnPath = new Stack<int>(); 
       numRandomMoves = 0; 

       for (int y = 0; y < 5; y++) 
       { 
        for (int x = 0; x < 5; x++) 
        { 
         c = new cellCharacteristics(); 
         c.isPit = false; 
         c.neighborsMarked = false; 
         c.numTimesvisited = 0; 

         AIGrid[x, y] = c; 
        } 
       } 
      } 
     } 
    } 

Tôi không biết làm thế nào để chuyển đổi này C# struct để F # và thực hiện các struct vào một mảng như mã của tôi ở trên.

+1

Tại sao bạn không sử dụng cấu trúc C# đó từ F #? Chính xác những gì bạn có vấn đề với? Bạn đã thử cái gì? BTW, cấu trúc có thể biến đổi là điều ác và bạn không nên sử dụng chúng trừ khi thực sự cần thiết. – svick

+0

nó chỉ là một số mảnh nhỏ từ mã của tôi, cấu trúc đó là bên trong một lớp, và lớp học có phương pháp sử dụng struct như Array. Tôi thử chuyển đổi lớp C# của tôi thành lớp F #. Tôi thêm mã vào mã ví dụ của tôi –

Trả lời

10

Bạn có thể xác định cấu trúc bằng cách sử dụng từ khóa struct (như được hiển thị bởi Stilgar) hoặc sử dụng thuộc tính Struct, trông giống như thế này. Tôi cũng đã thêm một constructor mà khởi cấu trúc:

[<Struct>] 
type CellCharacteristics = 
    val mutable p : int 
    val mutable w : int 
    val mutable i : bool 
    val mutable ne : bool 
    val mutable nu : int 

    new(_p,_w,_i,_ne,_nu) = 
    { p = _p; w = _w; i = _i; ne = _ne; nu = _nu } 

// This is how you create an array of structures and mutate it 
let arr = [| CellCharacteristics(1,2,true,false,3) |] 
arr.[0].nu <- 42 // Fields are public by default 

Tuy nhiên, nó thường không được khuyến khích sử dụng các loại giá trị có thể thay đổi. Điều này gây ra hành vi khó hiểu và mã là khá khó khăn để lý do. Điều này không được khuyến khích không chỉ trong F #, mà ngay cả trong C# và .NET nói chung. Trong F #, việc tạo ra một cấu trúc bất biến cũng dễ dàng hơn là:

// The fields of the strcuct are specified as part of the constructor 
// and are stored in automatically created (private) fileds 
[<Struct>] 
type CellCharacteristics(p:int, w:int, i:bool, ne:bool, nu:int) = 
    // Expose fields as properties with a getter 
    member x.P = p 
    member x.W = w 
    member x.I = i 
    member x.Ne = ne 
    member x.Nu = nu 

Khi sử dụng cấu trúc không thay đổi, bạn sẽ không thể sửa đổi các lĩnh vực cá nhân của struct. Bạn sẽ cần phải thay thế toàn bộ giá trị struct trong mảng thay thế. Bạn thường có thể thực hiện tính toán như một thành viên của cấu trúc (nói Foo) và sau đó chỉ cần viết arr.[0] <- arr.[0].Foo() để thực hiện cập nhật.

+0

tôi hiểu về mã của bạn, nhưng tôi vẫn không nhận được mã khi tôi muốn triển khai mã trong mã của mình. Trong mã của tôi, cấu trúc nằm trong một lớp, và trong C# i có thể thực hiện cấu trúc thành một mảng dễ dàng. Tôi không thể giải thích điều này tốt hơn, bởi vì tiếng Anh của tôi không tốt. Nếu bạn không phiền, hãy xem liên kết này: http://stackoverflow.com/questions/8126680/need-help-to-convert-my-homework-from-c-sharp-to-f –

+0

oh xin lỗi , có vẻ như tôi đã phá vỡ các quy tắc, vì vậy liên kết đã bị đóng –

Các vấn đề liên quan