2009-05-27 50 views
5

Tôi cần viết một hàm sẽ nhận một số lượng đối số thay đổi. Tôi đọc một chút về params [], nhưng tôi không nghĩ rằng sẽ làm việc trong trường hợp của tôi. Hàm của tôi cần có một số lượng biến int và sau đó là một giá trị bool tương ứng cho mỗi giá trị. Tôi phải lặp qua từng kết hợp này và nhập chúng vào cơ sở dữ liệu. Chỉ cần tìm ai đó để chỉ cho tôi đi đúng hướng. Cảm ơn.Chuyển số lượng đối số có thể thay đổi

Trả lời

16

Tôi khuyên bạn nên tạo cấu trúc và sau đó chuyển các cấu trúc đó dưới dạng tham số. Trong ví dụ của tôi, struct của bạn đại diện cho một số điểm của một số loại:

public struct RaceScore 
{ 
    public bool FinishedRace; 
    public int Points; 
} 

phương pháp chữ ký của bạn sau đó sẽ là:

public void SaveScores(params RaceScore[] scores) 

Dưới đây là một ví dụ về SaveScores gọi:

RaceScore score = new RaceScore() { FinishedRace = true, Points = 20 }; 
RaceScore score2 = new RaceScore() { FinishedRace = false, Points = 15 }; 
SaveScores(score, score2); 
+2

Cần lưu ý rằng một cấu trúc thực sự chỉ thích hợp cho một vài biến. Một lớp học phù hợp hơn cho bất cứ điều gì nhiều hơn thế. –

+0

Chỉ vì tò mò, tại sao một cấu trúc không phù hợp với nhiều hơn một vài biến? –

+1

Một phần vì ngữ nghĩa của các cấu trúc: bất cứ khi nào bạn chuyển một phương thức, một bản sao được tạo ra, tốn kém hơn là chuyển một tham chiếu (đó là điều sẽ xảy ra nếu bạn chuyển kiểu tham chiếu) . – Ant

5

Điều đó đúng - nó sẽ không hoạt động như được mô tả. Những gì bạn có thể làm là sử dụng một cấu trúc để tham gia int và giá trị bool. Params của structs đang làm việc:

public struct IntBoolStruct { 
    public bool BoolValue; 
    public int IntValue; 
} 

public void YourMethod(params IntBoolStruct[] values) {} 

EDIT: Tùy thuộc vào những gì bạn muốn làm, cũng có thể giúp bạn.

public void YourMethod(params int?[] values) {} 
+0

1 cho các đề nghị nullable. Great điểm - đó có thể là đủ, tùy thuộc vào mục đích của bool. –

11

Bạn có thể làm điều này với params, nhưng params cần phải là một số class hoặc struct giữ int của bạn + bool của bạn. KeyValuePair<TKey,TValue> trong thư viện lớp cơ sở sẽ hoạt động, nếu bạn không muốn viết lớp hoặc cấu trúc của riêng bạn. Tuy nhiên, tôi khuyên bạn nên sử dụng IEnumerable<T> vì việc sử dụng đơn giản hơn nhiều.

Ví dụ:

public void SaveValues(IEnumerable<KeyValuePair<int,bool>> values) 
{ 
    foreach(var pair in values) 
    { 
     int intVal = pair.Key; 
     bool boolVal = pair.Value; 
     // Do something here... 
    } 
} 

Điều tương tự cũng sẽ làm việc với params, ví dụ:

public void SaveValues(params KeyValuePair<int,bool>[] values) 

này, mặc dù, buộc bạn phải thực hiện một mảng. Sử dụng IEnumerable<T> sẽ làm việc với một mảng, nhưng cũng sẽ làm việc với danh sách các giá trị, hoặc kết quả truy vấn LINQ, vv Điều này làm cho việc tạo ra gọi hàm này dễ dàng hơn trong nhiều trường hợp.

+1

+1. Giải pháp tốt hơn so với câu trả lời từ điển của tôi, tôi không nên giả định rằng các số nguyên là ID. – Brandon

+1

Điều này nghe có vẻ như nó sẽ là hoàn hảo, nhưng tôi không nghĩ rằng nó có sẵn trong 1.1, đó là những gì tôi bị giới hạn với dự án này. Tôi nên lưu ý điều đó. –

0

Và một câu trả lời khác: bạn có thể làm điều này với một mảng và tham số đối tượng đơn giản.

class paramstest { 
     private void _passALot(params Object[] values) { 
      System.Console.WriteLine(" [foreach]"); 

      foreach (object o in values) { 
       System.Console.Write(o.ToString() + ", "); 
      } 

      System.Console.WriteLine(System.Environment.NewLine + " [for]"); 

      for (int i = 0; i < values.Length; i += 2) { 
       int? testval = values[i] as Int32?; 
       bool? testbool = values[i + 1] as Boolean?; 

       System.Console.WriteLine(String.Format("Int: {0}, Bool: {1}", testval, testbool)); 
      } 
     } 

     public void test() { 
      _passALot(1, true, 2, false, 3, true, "q", false); 
     } 
    } 

đem lại cho bạn

 
[foreach] 
1, True, 2, False, 3, True, q, False, 
[for] 
Int: 1, Bool: True 
Int: 2, Bool: False 
Int: 3, Bool: True 
Int: , Bool: False 

Đi qua một từ điển hoặc một danh sách với một struct thích hợp sẽ tốt hơn mặc dù :)

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