2010-01-28 32 views
9

Trước khi sử dụng String.Format để định dạng một chuỗi trong C#, tôi muốn biết có bao nhiêu tham số mà chuỗi đó chấp nhận?Chuỗi có bao nhiêu tham số

Ví dụ: nếu chuỗi là "{0} không giống như {1}", tôi muốn biết rằng chuỗi này chấp nhận hai tham số Ví dụ: nếu chuỗi là "{0} không giống như {1} và {2}", chuỗi chấp nhận 3 tham số

Làm cách nào để tìm hiệu quả?

+0

Điều này không dễ. Bạn đang cố gắng để thực hiện? Có gần như chắc chắn là một cách tốt hơn để đi về nó. – Auraseer

Trả lời

6

String.Format nhận đối số chuỗi có giá trị format và một mảng params object[], có thể xử lý các mục có giá trị lớn tùy ý.

Đối với mỗi giá trị object, đó là phương pháp .ToString() sẽ được gọi để giải quyết rằng mẫu định dạng

EDIT: Có vẻ tôi không nhận định câu hỏi của bạn. Nếu bạn muốn biết có bao nhiêu đối số được yêu cầu phải định dạng, bạn có thể khám phá ra rằng bằng cách sử dụng một biểu thức chính quy:

string pattern = "{0} {1:00} {{2}}, Failure: {0}{{{1}}}, Failure: {0} ({0})"; 
int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets 
    @"\{\d+(?:\:?[^}]*)\}").Count; // returns 6 

Như Benjamin lưu ý trong các ý kiến, có thể bạn cần phải biết số tài liệu tham khảo khác nhau. Nếu bạn không sử dụng LINQ, tại đây bạn đi:

int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets 
    @"\{(\d+)(?:\:?[^}]*)\}").OfType<Match>() 
    .SelectMany(match => match.Groups.OfType<Group>().Skip(1)) 
    .Select(index => Int32.Parse(index.Value)) 
    .Max() + 1; // returns 2 

Đây cũng là địa chỉ @280Z28 vấn đề mới nhất được phát hiện.

Sửa bởi 280Z28: Điều này sẽ không xác nhận đầu vào, nhưng đối với bất kỳ đầu vào hợp lệ sẽ cho câu trả lời đúng:

int count2 = 
    Regex.Matches(
     pattern.Replace("{{", string.Empty), 
     @"\{(\d+)") 
    .OfType<Match>() 
    .Select(match => int.Parse(match.Groups[1].Value)) 
    .Union(Enumerable.Repeat(-1, 1)) 
    .Max() + 1; 
+0

Bạn không bắt được '" Thất bại: {0} {{{1}}} "' hoặc '" Lỗi: {0} ({0}) "'. –

+0

Và OP muốn biết số lượng đối tượng để chuyển đến cuộc gọi, afaik - vì vậy anh ta không cần số lượng tham chiếu mà là số lượng tham chiếu khác nhau. "{0} {0} {1}" có thể được tính là "2" trong thế giới của anh ấy. Điều này là rất dễ dàng từ biểu hiện của bạn mặc dù. Tốt đẹp. –

+0

@Rubens: Đúng, bạn đã nhận được đầu tiên trong số họ nhưng không phải là thứ hai. Bạn phải phân tích cú pháp các kết quả khớp với một số nguyên và lấy số cộng tối đa 1. Đây là một số nguyên hợp lệ: '" {2} "' (ba tham số, nhưng chỉ có một thay thế). –

1

Bạn sẽ phải phân tích cú pháp thông qua chuỗi và tìm giá trị số nguyên cao nhất giữa số {} '... sau đó thêm một.

... hoặc đếm số bộ {} của.

Dù bằng cách nào, nó xấu xí. Tôi muốn được quan tâm để biết lý do tại sao bạn cần để có thể tìm ra con số này theo chương trình.

EDIT

Như 280Z28 đề cập, bạn sẽ phải giải thích cho các idiosyncrasies khác nhau về những gì có thể được bao gồm giữa {} 's (nhiều {}' s, định dạng chuỗi, vv).

+2

Nhưng hãy nhớ rằng '{{Tricky}}' có thể xuất hiện, như có thể '{0: 0000}'. –

+0

vì vậy, tại sao tôi cần điều này? Tôi đang làm việc với các tài liệu OpenXML nơi các truy vấn xpath được đặt bên trong phần xml tùy chỉnh của tài liệu từ. Trong mã của tôi, tôi cần phải thay thế các tham số trong truy vấn xpath với các giá trị dựa trên ngữ cảnh của xpath đó. Số lượng tham số trong các xpath khác nhau trong tài liệu sẽ thay đổi vì vậy nếu tôi có thể tìm thấy số tham số mà chuỗi chấp nhận, tôi có thể sử dụng if-else dựa trên đó để thực hiện đúng Chuỗi.Định dạng Tôi hy vọng tôi đã giải thích rõ ràng điều này. –

+0

Về cơ bản, bạn cần phải thực hiện chính mình nửa đầu của 'StringBuilder.AppendFormat (nhà cung cấp IFormatProvider, định dạng chuỗi, thực thi phương thức params object [] args)' (~ 75 dòng mã) để xử lý tất cả các idiosyncrasies. –

1

Tôi dựa vào ReSharper để phân tích rằng đối với tôi, và đó là một điều đáng tiếc rằng Visual Studio không có tính năng gọn gàng như vậy.

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