2009-03-04 27 views

Trả lời

29

Ok, chỉ cần gõ lên một số mã để thời gian phương pháp của bạn chống lại điều này:

int count = 0; 
for (int i = 0; i < s.Length; i++) 
{ 
    if (char.IsUpper(s[i])) count++; 
} 

Kết quả:

Yours: 19.737 ve

Mine: 118 ticks

chênh lệch khá lớn! Đôi khi cách thẳng tiến nhất là hiệu quả nhất.

Sửa

Chỉ cần ra quan tâm, này:

int count = s.Count(c => char.IsUpper(c)); 

Đi kèm ở vào khoảng 2500 ve. Vì vậy, đối với một "Linqy" một lớp lót nó khá nhanh chóng.

+1

+1 giải pháp trường học cũ tốt đẹp :) –

+0

D'oh! Pipped tại bài viết, gần như chính xác cùng một giải pháp. Làm tốt lắm Matt, những ngón tay chậm chạp ngu ngốc. . . –

+0

Nhân tiện, +1 bạn đời, bạn kiếm được nó :) –

3

Bạn chỉ đếm ASCII chuẩn và không ADE, vv

Làm thế nào về

CommentText.ToCharArray().Where(c => Char.IsUpper(c)).Count() 
+0

Nhờ đó - Tôi đang tìm kiếm c.Upper trong intellisense - không nghĩ đến cái kia. – peterorum

+0

Đừng quên: Việc này đếm số chữ hoa bất kể số từ. – PeterCo

3

Thậm chí không cần thử nghiệm tôi muốn nói

int count = 0; 
foreach (char c in commentText) 
{ 
    if (Char.IsUpper(c)) 
     count++; 
} 

là nhanh hơn, ngoài khơi tại để kiểm tra nó.

+0

Đúng là ngang bằng (hoặc thậm chí là một vài bọ ve nhanh hơn) so với vòng lặp "for" của tôi. –

+0

Không bận tâm để kiểm tra nó, như Matt Hamilton đã chu đáo đủ để làm điều này cho tôi :) –

6

Trước tiên, không có lý do nào bạn cần gọi ToCharArray() vì, giả sử CommentText là một chuỗi đã là IEnumerable<char>. Thứ hai, có lẽ bạn nên gọi số char.IsUpper thay vì giả sử bạn chỉ xử lý các giá trị ASCII. Mã này thực sự sẽ giống như thế,

CommentText.Count(char.IsUpper) 

Thứ ba, nếu bạn đang lo lắng về tốc độ không có nhiều đến nỗi có thể đánh bại cái cũ cho vòng lặp,

int count = 0; 
for (int i = 0; i < CommentText.Length; i++) 
    if (char.IsUpper(CommentText[i]) count++; 

Nói chung, gọi phương thức bất kỳ đang diễn ra chậm hơn so với nội tuyến mã nhưng loại tối ưu hóa này chỉ nên được thực hiện nếu bạn hoàn toàn chắc chắn đây là cổ chai trong mã của bạn.

+0

Dude, nên "có nhiều" được "không có nhiều"? –

+0

Doh, vâng. Đã sửa. – chuckj

+0

Cảm ơn câu trả lời của bạn. Mã linq rất ngắn gọn. – peterorum

2

Việc bạn đang làm với mã đó là tạo bộ sưu tập với các ký tự, sau đó tạo bộ sưu tập mới chỉ chứa các ký tự viết hoa, sau đó chỉ lặp lại bộ sưu tập đó để tìm xem có bao nhiêu.

này sẽ thực hiện tốt hơn (nhưng vẫn không khá tốt như một vòng lặp đơn giản), vì nó không tạo ra những bộ sưu tập trung:

CommentText.Count(c => Char.IsUpper(c)) 

Edit: Removed cuộc gọi ToCharArray cũng như Matt đề nghị.

+0

+1 để di chuyển biến vị ngữ vào Đếm. Lấy đi ToCharArray là tốt và nó tăng tốc đáng kể. –

+0

Điểm tốt. Tôi đã làm một cái gì đó tương tự trước và sau đó ToCharArray là cần thiết, nhưng không phải trong trường hợp này. :) – Guffa

2

Tôi đã có này

Regex x = new Regex("[A-Z]{1}", 
    RegexOptions.Compiled | RegexOptions.CultureInvariant); 
int c = x.Matches(s).Count; 

nhưng tôi không biết nếu nó đặc biệt nhanh chóng. Nó sẽ không nhận được ký tự đặc biệt trong hai, tôi s'pose

EDIT:

nhanh so với câu trả lời của câu hỏi này. Debug trong vshost, 10'000 lặp với chuỗi:
aBcDeFGHi1287jKK6437628asghwHllmTbynerA

  • Câu trả lời: 20-30 ms
  • Giải pháp regex: 140-170 ms
+0

Cảm ơn bạn đã so sánh - Tôi tự hỏi làm thế nào một regex sẽ xếp chồng lên nhau. – peterorum

+0

Bạn có thể kết hợp thành một dòng: 'Regex.Matches (s," [A-Z] {1} ", RegexOptions.Compiled | RegexOptions.CultureInvariant) .Count;' –

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