2013-07-06 39 views

Trả lời

14

Bạn có thể so sánh IndexOf để LastIndexOf để kiểm tra nếu có nhiều hơn một ký tự cụ thể trong một string mà không đếm rõ ràng:

var s = "12121.23.2"; 
var ch = '.'; 
if (s.IndexOf(ch) != s.LastIndexOf(ch)) { 
    ... 
} 
+0

Điều này không thành công nếu ký tự không có mặt, vì cả hai chỉ số đều đánh giá -1. –

+3

@DrewNoakes Tại sao? Nếu ký tự không hiện diện, cả hai hàm trả về '-1', vì vậy'! = 'Ước lượng thành' false'. Bạn cần hai hoặc nhiều ký tự trong đó: đối với số không hoặc một ký tự, chỉ mục đầu tiên và cuối cùng là giống nhau (chỉ mục thực tế hoặc '-1'). – dasblinkenlight

+0

Ugh, vâng, bạn đúng :) Lỗi của tôi. –

7

Bạn có thể dễ dàng đếm số lần xuất hiện của một nhân vật với LINQ:

string foo = "12121.23.2"; 
foo.Count(c => c == '.'); 
2
Boolean MoreThanOne(String str, Char c) 
{ 
    return str.Count(x => x==c) > 1; 
} 
+0

chuỗi và char không thể có dấu bằng trong chúng – Arka

+0

Có và tôi không sử dụng nó trong câu trả lời của tôi, hãy hiểu những gì tôi đang làm, nếu bạn không hiểu sau đó thử chạy và xem cho chính mình nếu nó hoạt động hay không. –

6

Nếu vấn đề hiệu suất, viết nó cho mình:

public static bool ContainsDuplicateCharacter(this string s, char c) 
{ 
    bool seenFirst = false; 
    for (int i = 0; i < s.Length; i++) 
    { 
     if (s[i] != c) 
      continue; 
     if (seenFirst) 
      return true; 
     seenFirst = true; 
    } 
    return false; 
} 

Bằng cách này, bạn chỉ thực hiện một lần thông qua nội dung của chuỗi và bạn bảo lãnh càng sớm càng tốt. Trong trường hợp xấu nhất, bạn chỉ truy cập tất cả các ký tự một lần. Trong câu trả lời của @ dasblinkenlight, bạn sẽ ghé thăm tất cả các nhân vật hai lần, và trong câu trả lời của @ mensi, bạn phải tính tất cả các trường hợp, mặc dù một khi bạn có hai bạn có thể ngừng tính toán. Hơn nữa, sử dụng phương pháp mở rộng Count liên quan đến việc sử dụng một số Enumerable<char> sẽ chạy chậm hơn so với truy cập trực tiếp các ký tự tại các chỉ mục cụ thể.

Sau đó, bạn có thể viết:

string s = "12121.23.2"; 

Debug.Assert(s.ContainsDuplicateCharacter('.')); 
Debug.Assert(s.ContainsDuplicateCharacter('1')); 
Debug.Assert(s.ContainsDuplicateCharacter('2')); 
Debug.Assert(!s.ContainsDuplicateCharacter('3')); 
Debug.Assert(!s.ContainsDuplicateCharacter('Z')); 

Tôi cũng nghĩ nó đẹp hơn để có một hàm giải thích chính xác những gì bạn đang cố gắng để đạt được. Bạn có thể bọc bất kỳ câu trả lời khác trong một chức năng như vậy quá, tuy nhiên.

0

Trả lời của dasblinkenlight gần như chính xác. Bạn cũng cần kiểm tra xem chuỗi có chứa '.' Không trong đó. Bởi vì cả hai IndexOf() và LastIndexOf() sẽ trả về -1 trong trường hợp không có '.' char trong chuỗi.

Đây được sửa chữa dụ:

var s = "12121.23.2"; 
var ch = '.'; 
if ((s.IndexOf(ch) >= 0) && (s.IndexOf(ch) != s.LastIndexOf(ch))) { 
    ... 
} 

EDIT: sai, không cần phải kiểm tra xem chuỗi thực sự chứa ''.

+0

Sai, xem nhận xét về câu trả lời của mình – mensi

+0

Vâng, tôi hiểu. Lỗi của tôi. – Aleksei

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