2008-08-05 40 views
16

Tôi có giá trị được lưu trữ dưới dạng các chuỗi trong DataTable trong đó mỗi giá trị thực sự có thể đại diện cho int, double hoặc string (tất cả đều được chuyển thành chuỗi trong quá trình nhập từ nguồn dữ liệu ngoài). Tôi cần kiểm tra và xem loại giá trị thực sự là gì.Cách hiệu quả nhất để kiểm tra loại đối tượng

Điều gì hiệu quả hơn cho ứng dụng (hoặc không có sự khác biệt thực tế)?

  1. Hãy thử chuyển đổi thành int (và sau đó double). Nếu chuyển đổi hoạt động, số tiền trả lại true. Nếu một ngoại lệ được ném, hãy trả lại false.
  2. Cụm từ thông dụng được thiết kế để khớp với mẫu của int hoặc double
  3. Một số phương pháp khác?

Trả lời

9

Sẽ sử dụng double.TryParse, nó có lợi ích hiệu suất.

3

Cá nhân tôi sử dụng int.tryparse, sau đó double.tryparse. Hiệu suất trên các phương pháp đó khá nhanh. Cả hai đều trả về một Boolean. Nếu cả hai thất bại thì bạn có một chuỗi, theo cách bạn đã xác định dữ liệu của bạn.

6

Tôi sẽ nói, đừng lo lắng nhiều về hiệu suất vi mô như vậy. Nó là tốt hơn để chỉ nhận được một cái gì đó để làm việc, và sau đó làm cho nó rõ ràng và súc tích và dễ đọc nhất có thể. Điều tồi tệ nhất bạn có thể làm là khả năng đọc hy sinh cho một số lượng không đáng kể hiệu suất. Cuối cùng, cách tốt nhất để giải quyết các vấn đề về hiệu suất là lưu chúng khi bạn có dữ liệu cho biết có sự cố hiệu suất thực tế ... nếu không bạn sẽ mất rất nhiều thời gian để tối ưu hóa và thực sự gây ra chi phí bảo trì cao hơn cho sau này.

Nếu bạn thấy tình trạng phân tích cú pháp này thực sự là nút cổ chai trong ứng dụng của bạn, THÌ là thời gian để thử và tìm ra cách nhanh nhất để giải quyết vấn đề là gì. Tôi nghĩ rằng Jeff (và nhiều người khác) đã viết blog về loại điều này rất nhiều.

5

Bạn sẽ nhận được các kết quả khác nhau cho các phương pháp khác nhau tùy thuộc vào việc bạn biên dịch có tối ưu hóa hay không. Về cơ bản bạn có một vài lựa chọn:

object o; 

//checking with is 
o is int 

//check type 
o.GetType() != typeof(int) 

//cast and catch exception 
try{ int j = (int) o; } 
catch {} 

//use the tryparse 
int.TryParse(Convert.ToString(o), out j) 

Bạn có thể dễ dàng thiết lập một ứng dụng giao diện điều khiển mà cố gắng từng 10.000 lần và trả về khoảng thời gian cho mỗi (kiểm tra khi o là một int và khi nó là cái gì khác).

Phương pháp try-catch là nhanh nhất nếu đối tượng không giữ một int, và đến nay chậm nhất nếu nó không (thậm chí chậm hơn GetType). int.TryParse là khá nhanh nếu bạn có một chuỗi, nhưng nếu bạn có một đối tượng không rõ nó chậm hơn.

Điều thú vị là với .Net 3.5 và tối ưu hóa được bật kiểm tra o is int mất cùng thời gian là try-catch khi o thực sự là một int. o is int chỉ chậm hơn một chút nếu o thực sự là cái gì khác.

Annoyingly FxCop sẽ ném lên cảnh báo nếu bạn làm điều gì đó như:

if(o is int) 
    int j = (int) o; 

Nhưng tôi nghĩ đó là một lỗi trong FxCop - nó không biết int là một kiểu giá trị và khuyến cáo bạn sử dụng o as int để thay thế.

Nếu đầu vào của bạn luôn là một chuỗi int.TryParse là tốt nhất, nếu không, toán tử is là nhanh nhất.

Khi bạn có một chuỗi, tôi sẽ xem xét liệu bạn có cần biết rằng đó là một int, chứ không phải là một đôi. Nếu số int.TryParse vượt qua thì double.TryParse để bạn có thể phân nửa số séc - trả lại số tiền gấp đôi hoặc chuỗi và tăng gấp đôi khi bạn mong đợi một int.

5

Sự cố bạn gặp phải là có thể có các tình huống mà câu trả lời có thể là cả ba loại.

3 có thể là một int, một đôi hoặc một chuỗi!

Tùy thuộc vào những gì bạn đang cố gắng thực hiện và mức độ quan trọng của chúng là một loại cụ thể. Nó có thể là tốt nhất chỉ để lại cho họ như họ là miễn là bạn có thể hoặc, cách khác, một số với một phương pháp để đánh dấu mỗi một (nếu bạn có quyền kiểm soát nguồn gốc của chuỗi ban đầu).

+0

Mục tiêu cuối cùng là cố gắng xác định loại dữ liệu độc nhất cho đối tượng. 3 sẽ là một int. 3,5 sẽ là gấp đôi. "Ba" sẽ là một chuỗi. Cuối cùng tôi đã đặt cùng một hàm thử một loạt các đối tượng.TryParse gọi cho đến khi nó có thể xác định loại dữ liệu "phù hợp nhất" là gì. –

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