2009-07-10 42 views
5

Tôi có một ArrayList mà được loại khác nhau của các giá trị trong đó, 1 giá trị gia>chuỗi, 2nd giá trị gia>datetime, giá trị 3 ->boolean và giá trị thứ 4 là int, làm thế nào để tìm thấy loại của họ và gán những giá trị phù hợp, giúp đỡ nào được đánh giá cao :)được loại đối tượng và gán giá trị phù hợp

đây là Mã của tôi:

foreach (object obj in lstTop) 
      { 

       if(obj.GetType() == string) 
       {do this...) 
       else if(obj.GetType() == DateTime) 
       {do this....} 
       else if(obj.GetType() == bool) 
       {do this....} 
       else if(obj.GetType() == Int) 
       {do this....} 
      } 

Cảm ơn tất cả các bạn, Mã cuối cùng của tôi:

string Subscription = ""; 
     DateTime issueFirst; 
     DateTime issueEnd; 

     foreach (object obj in lstTop) 
     { 
      ///Type t = obj.GetType(); 
      if (obj is string) 
       Subscription += obj + ","; 
      else if (obj is DateTime) 
      { 
       Subscription += Convert.ToDateTime(obj).ToShortDateString() + ","; 
      } 
      /// else if (t == typeof(DateTime))     
     } 
    return ("User Authenticated user name: " + userName + ", Subscription: " + Subscription); 
+0

Thêm typeof() vào trước loại, ví dụ: typeof (string), typeof (DateTime). –

+0

'2.0' của chính nó là một sự lựa chọn thẻ thực sự nghèo. Vui lòng chú ý hơn đến lời nhắc tự động đề xuất cho các câu hỏi của bạn trong tương lai: gắn thẻ chính xác là cách mọi người đủ điều kiện sẽ tìm thấy câu hỏi của bạn. –

+2

Nếu bạn có thể, hãy thoát khỏi tình huống này. Một danh sách mảng là một cách khủng khiếp để biểu diễn bốn bộ dữ liệu. Xem xét việc xác định lớp tùy chỉnh chứa bốn dữ liệu này và sử dụng dữ liệu đó thay thế. –

Trả lời

7
foreach (object obj in lstTop) 
     { 

      if(obj is string) 
      {do this.....} 
      else if(obj is DateTime) 
      {do this.....} 
      else if(obj is bool) 
      {do this.....} 
      else if(obj is Int) 
      {do this.....} 
      else 
      { 
       // always have an else in case it falls through 
       throw new Exception(); 
      } 
     } 
2

ArrayLists trong Net 2.0 là hầu như luôn luôn sai cách để làm điều đó. Ngay cả khi bạn không biết danh sách sẽ giữ gì, bạn nên sử dụng chung loại List<Object> vì giao tiếp với người khác rằng danh sách thực sự có thể chứa bất kỳ thứ gì và không chỉ là một phần còn lại từ một lập trình viên .Net 1.1.

Ngoài ra, từ khóa is nên làm những gì bạn muốn:

if (obj is string) 
    // do this 
else if (obj is DateTime) 
    // do this 
// ... 

Cập nhật Tôi biết điều này là cũ, nhưng nó đưa ra trong thông báo của tôi ngày hôm nay. Đọc nó một lần nữa, nó xảy ra với tôi rằng một cách tốt đẹp để làm điều này là thông qua nghị quyết kiểu cho một chức năng quá tải:

void DoSomething(string value) { /* ... */ } 
void DoSomething(DateTime value) { /* ... */ } 

DoSomething(obj); 
+0

"Nhưng ngoài ra, bà Lincoln ..." – mquander

1

Giải pháp đơn giản nhất là không sử dụng một vòng lặp kể từ khi bạn biết chính xác những gì trong danh sách của bạn.

string myString = (string) lstTop[0]; 
DateTime myDate = (DateTime) lstTop[1]; 
bool  myBool = (bool)  lstTop[2]; 
int  myInt = (int)  lstTop[3]; 
+0

Các chỉ số có thể khác nhau. Không phải lúc nào cũng đáng tin cậy. –

+0

Tôi sẽ không khuyên bạn nên điều này bởi vì các phôi trực tiếp sẽ ném lỗi thời gian chạy nếu dàn diễn viên không thành công. –

0

Chỉ cần một số mã hơi bụi:

foreach (object obj in lstTop) 
     { 

      if(obj is string) 
      {do this...) 
      else if(obj is DateTime) 
      {do this....} 
      else if(obj is bool) 
      {do this....} 
      else if(obj is int) 
      {do this....} 
     } 

Nếu mảng của bạn luôn luôn có các đối tượng tương tự trong cùng một vị trí, mặc dù chỉ là chỉ số vào mảng và làm phôi trực tiếp.

0
 foreach (object obj in lstTop) 
     { 

      if(obj.GetType() == typeof(string)) 
      {do this...) 
      else if(obj.GetType() == typeof(DateTime)) 
      {do this....} 
      else if(obj.GetType() == typeof(bool)) 
      {do this....} 
      else if(obj.GetType() == typeof(int)) 
      {do this....} 
     } 

Phương thức GetType trả về System.Type của đối tượng. Do đó, bạn cần phải so sánh nó với một số khác System.Type, mà bạn nhận được bằng cách sử dụng typeof.

1

Nếu danh sách của bạn có chứa chính xác một giá trị của từng loại mà bạn có thể lưu trữ nó trong một Dictionary thay vì (nếu sử dụng một ArrayList không phải là một yêu cầu cụ thể), và chỉ cần lấy giá trị dựa trên các loại yêu cầu:

private Dictionary<Type, Object> data = GetDataList(); 
string myString = (string)data[typeof(string)]; 
int myInt = (int)data[typeof(int)]; 

Điều này sẽ làm cho quá trình tìm nạp các giá trị hơi mạnh mẽ hơn vì nó không phụ thuộc vào các giá trị xuất hiện theo bất kỳ thứ tự cụ thể nào.

Ví dụ về chuyển đổi ArrayList đến một cuốn từ điển như:

ArrayList data = new ArrayList(); 
data.Add(1); 
data.Add("a string"); 
data.Add(DateTime.Now); 

Dictionary<Type, Object> dataDictionary = new Dictionary<Type, object>(); 
for (int i = 0; i < data.Count; i++) 
{ 
    dataDictionary.Add(data[i].GetType(), data[i]); 
} 
1

Thay vì sử dụng các loại nguyên thủy, tôi muốn có một lớp trừu tượng mà gói gọn từng loại dữ liệu.Sau đó, logic xử lý loại đó có thể được nhúng vào chính lớp đó.

foreach(MyBaseData data in lstData) 
{ 
    data.DoTheRightThing(); 
} 

Nói chung, bất kỳ mã mà chuyển vào loại của một đối tượng nên được coi là một mùi thiết kế - nó có thể không nhất thiết phải là sai, nhưng nó có thể là một ý tưởng tốt để có một cái nhìn vào nó.

Trong khi viết một lớp để đóng gói một loại đơn giản có thể cảm thấy như công việc không cần thiết, tôi không nghĩ rằng tôi đã bao giờ hối hận vì làm điều đó.

+0

Tạo các phương thức mở rộng cho các loại đơn giản có lẽ sẽ ít rắc rối hơn là đóng gói từng loại một. – Shocked

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