2010-10-04 30 views
37

Có cách nào để tạo điều kiện tình huống trong câu lệnh chuyển đổi nơi bạn nói nếu chuỗi bắt đầu bằng thứ gì đó không?C# Chuỗi trường hợp chuyển đổi bắt đầu bằng

Switch (mystring) 
{ 
    case("abc")://String begins with abc (abcd or abc1 or abcz or abc.. or abc will fall in this condition). 
     //Do Something 
     break; 
    default: 
     break; 
} 

CẬP NHẬT dây khác có thể chiều dài khác nhau.

abc ..

abczyv

dcs2.

qwerty

như ... k

+0

có trường hợp chuyển đổi của bạn tất cả sẽ có cùng độ dài? ví dụ. ABC, XYZ – Paddy

+0

@Paddy: Không, chúng có thể có độ dài khác nhau.Cảm ơn. – Amra

Trả lời

28

Nếu bạn biết rằng chiều dài của điều kiện bạn sẽ chăm sóc tất cả về sẽ có cùng độ dài sau đó bạn có thể:

switch(mystring.substring(0, Math.Min(3, mystring.Length)) 
{ 
    case "abc": 
    //do something 
    break; 
    case "xyz": 
    //do something else 
    break; 
    default: 
    //do a different thing 
    break; 
} 

Các Math.Min(3, mystring.Length) là có để cho một chuỗi dưới 3 ký tự sẽ không ném một ngoại lệ về hoạt động chuỗi con.

Có các phần mở rộng của kỹ thuật này để khớp với ví dụ: một loạt các chuỗi 2-char và một chuỗi các chuỗi 3 char, trong đó một số so sánh 2-char khớp với sau đó được theo sau bởi các so sánh 3-char. Trừ khi bạn có một số lượng rất lớn các chuỗi như vậy, nó nhanh chóng trở nên kém hiệu quả hơn so với chuỗi đơn giản nếu có khác cho cả mã chạy và người phải duy trì nó.

Chỉnh sửa: Đã thêm từ khi bạn hiện đã tuyên bố chúng sẽ có độ dài khác nhau. Bạn có thể làm mẫu mà tôi đã đề cập đến để kiểm tra các ký tự X đầu tiên và sau đó là ký tự Y tiếp theo và vân vân, nhưng trừ khi có một mẫu mà hầu hết các chuỗi đều có độ dài như nhau, điều này sẽ không hiệu quả và khủng khiếp để duy trì. của bi quan sớm).

Mẫu lệnh được đề cập trong câu trả lời khác, vì vậy tôi sẽ không cung cấp chi tiết về điều đó, cũng như khi bạn ánh xạ mẫu chuỗi thành ID, nhưng chúng là tùy chọn.

Tôi sẽ không thay đổi từ các chuỗi if-else để chỉ huy hoặc lập bản đồ mẫu để đạt được hiệu quả chuyển đổi đôi khi đã kết thúc nếu bạn mất nhiều hơn so với lệnh hoặc lấy mẫu ID. Tôi sẽ làm như vậy nếu nó làm cho mã rõ ràng hơn. Một chuỗi các if-else có thể hoạt động khá tốt, hoặc với các so sánh chuỗi hoặc với các biểu thức thông thường (sau này nếu bạn so sánh phức tạp hơn so với các tiền tố cho đến nay, có lẽ sẽ đơn giản hơn và nhanh hơn, tôi ' m đề cập đến reg-ex chỉ vì họ đôi khi làm việc tốt với các trường hợp chung hơn của loại hình này).

Nếu bạn tìm kiếm if-elses, hãy thử xem xét những trường hợp nào sẽ xảy ra thường xuyên nhất và thực hiện các kiểm tra đó trước các trường hợp ít phổ biến hơn (mặc dù tất nhiên nếu "bắt đầu với abcd" là trường hợp tìm kiếm nó sẽ phải được kiểm tra trước khi "bắt đầu với abc").

+1

'Math.Min (3, mystring.Length)' liên lạc tốt đẹp, không biết rằng +1 –

5

Nếu tất cả các trường hợp có cùng độ dài, bạn có thể sử dụng
switch (mystring.SubString(0,Math.Min(len, mystring.Length))).
Một tùy chọn khác là có một hàm sẽ trả về categoryId dựa trên chuỗi và bật id.

1

Ngoài câu trả lời chuỗi con, bạn có thể làm điều đó như mystring.SubString (0,3) và kiểm tra trường hợp câu lệnh nếu "abc" của nó.

Nhưng trước khi tuyên bố chuyển đổi, bạn cần phải đảm bảo rằng bí ẩn của bạn là ít nhất 3 chiều dài.

13

Câu trả lời ngắn: Số

Câu lệnh chuyển đổi có biểu thức chỉ được đánh giá một lần. Dựa trên kết quả, một đoạn mã khác được thực thi.

Vì vậy, những gì? => String.StartsWith là một hàm. Cùng với một tham số đã cho, nó là một biểu thức. Tuy nhiên, đối với trường hợp của bạn, bạn cần phải vượt qua một tham số khác nhau cho từng trường hợp, do đó, nó không thể được đánh giá chỉ một lần.

Câu trả lời dài # 1 đã được người khác đưa ra.

dài câu trả lời # 2:

Tùy thuộc vào những gì bạn đang cố gắng để đạt được, bạn có thể quan tâm đến các Command Pattern/Chain-of-responsibility pattern. Áp dụng cho trường hợp của bạn, mỗi đoạn mã sẽ được thể hiện bằng cách triển khai Lệnh. Ngoài phương thức thực hiện phương thức, lệnh có thể cung cấp phương thức boolean Chấp nhận, kiểm tra xem chuỗi đã cho có bắt đầu bằng thông số tương ứng hay không.

Ưu điểm: Thay vì câu lệnh chuyển mã cứng, mã hóa StartsWith đánh giá và chuỗi được mã hóa cứng, bạn sẽ linh hoạt hơn nhiều.

Ví dụ bạn đưa ra trong câu hỏi của bạn sau đó sẽ trông như thế này:

var commandList = new List<Command>() { new MyABCCommand() }; 

foreach (Command c in commandList) 
{ 
    if (c.Accept(mystring)) 
    { 
     c.Execute(mystring); 
     break; 
    } 
} 

class MyABCCommand : Command 
{ 
    override bool Accept(string mystring) 
    { 
     return mystring.StartsWith("abc"); 
    } 
}  
3

Nếu miền vấn đề có một số loại khái niệm chuỗi tiêu đề, điều này có thể được mô hình hóa như một enum.

switch(GetStringHeader(s)) 
{ 
    case StringHeader.ABC: ... 
    case StringHeader.QWERTY: ... 
    ... 
} 

StringHeader GetStringHeader(string s) 
{ 
    if (s.StartsWith("ABC")) return StringHeader.ABC; 
    ... 
} 

enum StringHeader { ABC, QWERTY, ... } 
-7

Hãy thử điều này và nói với tôi nếu nó hoạt động hy vọng nó giúp bạn:

string value = Convert.ToString(Console.ReadLine()); 

Switch(value) 
{ 
    Case "abc": 

    break; 

    default: 

    break; 
}  
+0

lý do tại sao tôi đã được downvoted ??? –

+4

Câu trả lời của bạn sẽ không hoạt động, một câu lệnh C# cơ bản là những gì bạn đã hiển thị. Điều này khớp với toàn bộ chuỗi, không phải là phần bắt đầu (mà câu hỏi yêu cầu). – wonea

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