2012-07-02 28 views
7
private void makeMoleVisable(int mole, PictureBox MoleHill) 
    { 
     switch (mole) 
     { 
      case 1: 
       if (p01.Image == pmiss.Image && MoleHill.Image == pHill.Image) 
       { 
        molesmissed ++; 
       } 
       p01.Image = MoleHill.Image; 
       break; 
      case 2: 
       if (p02.Image == pmiss.Image && MoleHill.Image == pHill.Image) 
       { 
        molesmissed++; 
       } 
       p02.Image = MoleHill.Image; 
       break; 

** Tôi có 36 báo cáo trường hợp này cho người khác cho một hộp hình khác; làm thế nào để tôi nhóm tất cả thành một tuyên bố trường hợp để mã của tôi có thể hiệu quả hơn **Làm cách nào để hợp nhất tất cả các trường hợp thành một?

+0

dân đã thể hiện điều này dưới đây, nhưng làm thế nào về việc truyền đối tượng hình ảnh (tức là p01, p02) làm đối số cho hàm, và hình ảnh nốt ruồi "foreach" gọi hàm này? – contactmatt

Trả lời

0

Hãy thử điều này:

 string ControlIdSuffix = mole < 10 ? "0" : "" + mole.ToString(); 
     Control[] picBoxes = this.Controls.Find("p" + ControlIdSuffix, true); 
     if (picBoxes.Length > 0) 
     { 
      PictureBox p = picBoxes[0] as PictureBox; 
      if (p != null) { 
       if (p.Image == pmiss.Image && MoleHill.Image == pHill.Image) 
        molesMissed++; 
       p.Image = MoleHill.Image; 
      } 
     } 
+0

Hãy xem xét điều này về dòng đầu tiên của bạn: (ví dụ) '1.ToString (" 00 ") ->" 01 "' –

+0

Cảm ơn bạn đã làm việc tốt nhất. –

9

Có vẻ như trường hợp của bạn được sử dụng để chọn hình ảnh, sau đó bạn luôn áp dụng cùng một quy trình cho hình ảnh.

Cách lưu trữ hình ảnh trong Danh sách hoặc Từ điển, sử dụng giá trị mole để truy xuất hình ảnh chính xác, sau đó xử lý hình ảnh đó?

Something như

Dictionary<int, PictureBox> images; 
var image = images[mole]; 
// do stuff to image 

Nếu những hình ảnh được đánh số tuần tự tất cả, một danh sách là hơi hiệu quả hơn. Hãy nhớ rằng các chỉ mục danh sách là 0 dựa. Nếu bạn đánh số hình ảnh của mình từ 1 như trường hợp từ câu lệnh switch (được giả định trong ví dụ sau), hãy nhớ điều chỉnh cho phù hợp.

List<PictureBox> images; 
int index = mole - 1; // Assumes mole starts with 1, so adjust to 0-based index 
var image = images[index]; 
+0

Và cuộn qua các nốt ruồi trong vòng lặp 'for'. – bluevector

+2

Chúng trông giống như tất cả các phím số nguyên tuần tự, do đó, một 'Danh sách' sẽ có ý nghĩa hơn một' Từ điển'. – Servy

+0

Có, họ cũng có thể được. Tôi đề cập đến 'Danh sách' như một cấu trúc dữ liệu ứng cử viên trong câu trả lời của tôi nhưng đã đi với' Từ điển' trong mẫu mã vì tôi không muốn đưa ra giả định đó. –

1

Bạn có thể đặt PictureBoxes của bạn vào một danh sách và sau đó truy cập chúng bằng chỉ số:

List<PictureBox> pbs = new List<PictureBox>(); 
foreach(Control c in this.Controls) if(c is PictureBox) pbs.Add((PictureBox)c); 

private void MakeMoleVisible(Int32 mole) { 
    pbs[ mole ] = // whatever 
} 
+0

Có vẻ như 'mole' có thể là 1-based, trong trường hợp này có thể cần phải bù đắp cho chỉ mục danh sách. –

+1

'pbs.AddRange (this.Controls.OfType ());' nếu bạn đang đi cho một một lót khi xác định danh sách thay vì nhồi nhét 3 vào 1. –

3

Điều đó khác với trong switch là biến PN. Thay vì đặt các đối tượng trong các biến rời rạc, tạo một mảng, bạn có thể chỉ số vào:

var p = new [] { p01, p02, .... } 

Và sau đó mã của bạn có thể trông như thế này:

if (p[mole-1].Image == pmiss.Image && MoleHill.Image == pHill.Image) 
{ 
    molesmissed ++; 
} 
p[mole-1].Image = MoleHill.Image 
+0

... có thể với một giới hạn nhỏ kiểm tra an toàn . –

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