2012-06-14 41 views
9

Ok guys, tôi biết nếu/else hoạt động, tôi cần một sự thay thế.Chuỗi con không hoạt động như mong đợi nếu chiều dài lớn hơn chiều dài của chuỗi

Tôi đang sử dụng

B = String.Concat(A.Substring(0, 40)); 

để nắm bắt được 40 ký tự đầu tiên của một giá trị.

Nếu giá trị tại A là hơn 40, B có khả năng nắm bắt, nhưng nếu giá trị của A là ít hơn 40, không có giá trị bị bắt tại B.

+4

Tại sao các bạn gọi 'String.Concat' với một đầu vào không? – Rawling

+1

Mục đích của 'String.Concat()' là gì? Ypu thường sử dụng nó để tham gia hai chuỗi với nhau, nhưng bạn chỉ đi qua trong một String? – DaveShaw

+0

_ "nhưng nếu giá trị [chiều dài] của A nhỏ hơn 40, thì không có giá trị nào được giữ tại B." _ - có thể do một ngoại lệ xảy ra. – CodeCaster

Trả lời

10

Không hiểu mục đích đi qua chỉ chuỗi duy nhất trong String.Concat. Mục đích của bạn có thể được giải quyết bằng cách:

if(A.Length > 40) 
     B= A.Substring(0,40); 
else 
     B=A; 
34

Nhanh chóng và bẩn:

A.Length > 40 ? A.Substring(0, 40) : A 
+0

+1 Mọi người luôn đánh tôi với cú đấm. = P – benjer3

+23

Tương tự nhanh chóng và bẩn: 'A.Substring (0, Math.Min (40, A.Length))' – ean5533

+3

Nhanh chóng cho chắc chắn, nhưng tại sao nó nên bẩn :)? –

5

Bạn có thể sử dụng Left từ Microsoft.VisualBasic.Strings.

B = Microsoft.VisualBasic.Strings.Left(A, 40); 

Bạn không biết tại sao bạn muốn sử dụng Concat.

+0

@Ramhound Trong đó cách chính xác này sẽ thất bại? Bạn thậm chí đã thử nghiệm nó? Tôi không nghĩ rằng bạn biết những gì 'trái' không. – sloth

+2

Sử dụng 'Left' thậm chí còn được coi là thực hành không tốt trong VB.NET, hãy để một mình nhập không gian tên cũ của VB vào C# để sử dụng nó ở đó ... – Ryan

+0

@dkson - Tốt. Tôi đã xem xét kỹ hơn phương pháp này. Nếu chiều dài dài hơn thì độ dài của chuỗi toàn bộ chuỗi được trả về. Tôi vẫn duy trì điều này là thực hành không tốt và do đó một câu trả lời tồi để duy trì cuộc bỏ phiếu của tôi. –

18

Tại sao không tạo tiện ích mở rộng cho nó ... hãy gọi nó là Cắt ngắn hoặc Trái hoặc bất kỳ thứ gì.

public static class MyExtensions 
{ 
    public static string Truncate(this string s, int length) 
    { 
     if(s.Length > length) return s.Substring(0, length); 
     return s; 
    } 
} 

Sau đó, bạn chỉ có thể gọi nó như vậy:

string B = A.Truncate(40); 

Cũng lưu ý rằng bạn không cần phải làm cho nó trở thành một phương pháp khuyến nông, mặc dù nó sẽ sạch hơn.

Trong lớp StringTool của bạn:

public static string Truncate(string value, int length) 
    { 
     if(value.Length > length) return value.Substring(0, length); 
     return value; 
    } 

Và để gọi nó là:

string B = StringTool.Truncate(A, 40); 
+0

cắt ngắn sẽ là sửa chữa đúng, đã có một số lượng rất lớn nếu/elses trong mã. – Lordlebu

+0

@Lordlebu - Tại sao bạn cố gắng giảm số câu lệnh if/else chính xác? –

+0

ok một lỗi - emlMessage.cs (198,35): lỗi CS0117: 'string' không chứa định nghĩa cho 'Truncate', tôi đã thử StringTool, vẫn không hoạt động – Lordlebu

5

sử dụng dưới mã để substring

B = String.padright(40).Substring(0, 40)) 
+0

Yêu thích giải pháp này thực sự –

+0

Nhưng sau khi văn bản có nhiều không gian. Bạn nên sử dụng điều này: 'B = String.padright (40, '\ 0'). Chuỗi con (0, 40))' – Gh61

+0

Đơn giản và thanh lịch, cộng với có thể được sử dụng nội tuyến mà không cần phương thức bổ sung – jolySoft

7

Extensions là tốt nhất cho các vấn đề như thế này;) Mine có một số tên bẩn nhưng tất cả mọi người biết những gì nó sẽ làm gì - đây là ngoại lệ an toàn chuỗi:

public static string SubstringNoLongerThanSource(this string source, int startIndex, int maxLength) 
{ 
    return source.Substring(startIndex, Math.Min(source.Length - startIndex, maxLength)); 
} 
3
B = string.Concat(A.Substring(0, Math.Min(40, A.Length))); 
Các vấn đề liên quan