2013-06-08 44 views
6

Tôi đang sử dụng hai dây cho một chương trình phù hợp như thế này:Hãy so sánh hai chuỗi sử dụng Regex

string s1= 5-4-6-+1-+1+1+3000+12+21-+1-+1-+1-+2-3-4-5-+1-+10+1-+1-+; 
string s2= 6-+1-+1+1+3000+12+21-+1-+1-+1-+1-+1-+1+1-+1-+; 

Và tôi sẽ viết một chức năng phù hợp Regex mà so sánh mỗi chuỗi phần giữa mỗi "+" riêng biệt và tính toán phần trăm đối sánh, là số lượng các kết quả phù hợp xảy ra trong mỗi chuỗi. Ví dụ trong ví dụ này, chúng tôi có những trận đấu:

6 

1 

1 

1 

3000 

12 

21 

1 

1 

1 

-- 

1 

-- 

1 

1 

Trong ví dụ này, phần trăm đối sánh là 13 * 100/15 = 87%.

Hiện tại tôi đang sử dụng chức năng bên dưới, nhưng tôi nghĩ nó không được tối ưu hóa và sử dụng Regex có thể nhanh hơn.

public double MatchPercent(string s1, string s2) { 
    int percent=0; 
    User = s1.Split('+').ToArray(); 
    Policy = s2.Split('+').ToArray(); 

    for (int i = 0; i < s1.Length - 2; i++) { 
     int[] U = User[i].Split('-').Where(a => a != "").Select(n => 
         Convert.ToInt32(n)).Distinct().ToArray(); 
     int[] P = Policy[i].Split('-').Where(a => a != "").Select(n => 
         Convert.ToInt32(n)).Distinct().ToArray(); 
     var Co = U.Intersect(P); 
     if (Co.Count() > 0) { 
      percent += 1; 
     } 
    } 
    return Math.Round((percent) * 100/s1.Length); 
} 
+1

Tôi không hiểu bạn muốn làm gì. Trong vòng lặp for của bạn, bạn không sử dụng giá trị iterator. Vì vậy, bạn luôn luôn nên có 98% trận đấu hoặc 0% trận đấu. –

+6

Tôi không nghĩ rằng cụm từ thông dụng sẽ hoạt động. Cụ thể, tôi không nghĩ rằng bạn có thể duy trì trạng thái (tức là số lượng mẫu) qua một regex theo cách này. Và tính toán điều này sau trận đấu sẽ yêu cầu một số lượng các nhóm chụp khác nhau. – jpaugh

+0

Chức năng này trước tiên chia tách hai chuỗi được phân tách bằng dấu "+" và tìm số đối sánh trong mỗi phần. @KirillBestemyanov Tôi đã chỉnh sửa lại chức năng, đó là lỗi đánh máy của tôi. – Kamran

Trả lời