2011-07-01 88 views
5

thể trùng lặp:
How to select min and max values of a column in a datatable?tìm min và max giá trị trong một DataTable sử dụng C#

tôi đang tìm kiếm mã mà có thể tìm thấy các min và max (hoặc đầu tiên và giá trị cuối cùng) từ một cột trong một datatable.

Tôi đã lưu trữ dữ liệu có giá trị bốn cột Tôi muốn tìm giá trị nhỏ nhất và tối đa từ cột thứ ba (chỉ mục 2) và hiển thị nó cho người dùng.

Tôi đã thử nhiều cách nhưng tất cả đều gây ra ngoại lệ ...

cuối tôi đã cố gắng mã này, nhưng ngay cả điều này không hoạt động ..

count = Convert.ToInt32(dt.Rows.Count); 

start = Convert.ToInt32(dt.Rows[0][2].ToString()); 

end = Convert.ToInt32(dt.Rows[count-1][2].ToString()); 

nhờ vince

+0

Bạn đang thấy ngoại lệ nào? –

+0

@David "không có hàng tại vị trí 0" đây là ngoại lệ mà tôi đang nhận cho dòng thứ hai ... và dữ liệu có thể đầy đủ .. nó không trống. – vince

Trả lời

16

Bạn có thể luôn sử dụng phương pháp .Select trên DataTable để nhận các hàng đó:

var maxRow = dt.Select("ID = MAX(ID)"); 

Điều này sẽ trả về một mảng DataRow[] - nhưng thông thường chỉ nên chứa một hàng duy nhất (trừ khi bạn có nhiều hàng có cùng giá trị tối đa).

Cùng đi với mức tối thiểu:

var minRow = dt.Select("ID = MIN(ID)"); 

Xem MSDN docs on DataTable.Select để biết thêm chi tiết.

0

Loại dữ liệu nào là countstartend được khai báo là? Điều đó không được hiển thị trong mã của bạn.

Ngoài ra, mã bạn đã cung cấp, nếu làm việc, sẽ chỉ cung cấp cho bạn phần tử đầu tiên và cuối cùng, KHÔNG phải là tối thiểu trong bộ và số tối đa trong bộ này. Nếu bạn đang tìm kiếm min/max, bạn cần phải viết một vòng lặp, như thế này:

// minimum 
int min = dt.Rows[0][2]; // assuming you want the third column (index 2) 
for(int i = 1; i < dt.Rows.Count; i++) 
{ 
    if(min > (int)dt.Rows[i][2]) min = (int)dt.Rows[i][2]; 
} 

// maximum 
int max = dt.Rows[0][2]; // assuming you want the third column (index 2) 
for(int i = 1; i < dt.Rows.Count; i++) 
{ 
    if(max < (int)dt.Rows[i][2]) max = (int)dt.Rows[i][2]; 
} 

Rõ ràng những cũng có thể được kết hợp thành một vòng duy nhất:

// minimum and maximum 
int max = dt.Rows[0][2]; // assuming you want the third column (index 2) 
int min = dt.Rows[0][2]; // assuming you want the third column (index 2) 
for(int i = 1; i < dt.Rows.Count; i++) 
{ 
    if(max < (int)dt.Rows[i][2]) max = (int)dt.Rows[i][2]; 
    if(min > (int)dt.Rows[i][2]) min = (int)dt.Rows[i][2]; 
} 

@marc_s' câu trả lời là thanh lịch hơn cho trường hợp sử dụng cụ thể của bạn (bảng dữ liệu), nhưng tôi sẽ làm việc cho bất kỳ tập dữ liệu nào trong một bộ sưu tập được lập chỉ mục.

+0

@Nate ... xin lỗi vì điều đó .. .all đó là int và datatable của tôi được sắp xếp theo cột đó vì vậy min và max là đầu tiên và các yếu tố cuối cùng .... – vince

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