2010-08-31 36 views
15

Cách tốt nhất để trả về từ đầu tiên của chuỗi trong C# là gì?chức năng chuỗi bên trái trong C#

Về cơ bản nếu chuỗi là "hello world", tôi cần nhận "hello".

Cảm ơn

+0

Dấu cách là ký tự duy nhất bạn muốn tách biệt các từ? Điều gì về trả lại tab, dòng mới và vận chuyển? – cwap

+0

mở rộng nhận xét của cwap: về dấu chấm câu thì sao? "Chào thế giới"? – lalli

Trả lời

19

Bạn có thể sử dụng một sự kết hợp của SubstringIndexOf.

var s = "Hello World"; 
var firstWord = s.Substring(0,s.IndexOf(" ")); 

Tuy nhiên, điều này sẽ không cung cấp từ được mong đợi nếu chuỗi đầu vào chỉ có một từ, vì vậy cần có trường hợp đặc biệt.

var s = "Hello"; 
var firstWord = s.IndexOf(" ") > -1 
        ? s.Substring(0,s.IndexOf(" ")) 
        : s; 
+6

Tôi sẽ thêm một trường hợp đặc biệt nếu chuỗi chỉ chứa một từ, ví dụ: if ** IndexOf ** trả về -1. –

0
string words = "hello world"; 
string [] split = words.Split(new Char [] {' '}); 
if(split.Length >0){ 
string first = split[0]; 
} 
+0

split.Length. Stack Overflow sẽ không cho phép tôi chỉnh sửa nó. – crh225

8

Một cách là để tìm kiếm một không gian trong chuỗi, và sử dụng vị trí của không gian để có được những từ đầu tiên:

int index = s.IndexOf(' '); 
if (index != -1) { 
    s = s.Substring(0, index); 
} 

Một cách khác là sử dụng một biểu thức chính quy để tìm một ranh giới từ:

s = Regex.Match(s, @"(.+?)\b").Groups[1].Value; 
35

Bạn có thể thử:

string s = "Hello World"; 
string firstWord = s.Split(' ').First(); 

Ohad Schneider's nhận xét là đúng, vì vậy bạn chỉ cần yêu cầu phần tử First() vì sẽ luôn có ít nhất một phần tử.

Đối biết thêm thông tin về việc có nên sử dụng First() hoặc FirstOrDefault() bạn có thể tìm hiểu thêm here

+4

Cải thiện nhẹ: sử dụng tình trạng quá tải cho 'String.Split' để tính số lần chia tối đa khi bạn không quan tâm đến tất cả trừ phần đầu tiên. – Richard

+1

Bạn không cần 'FirstOrDefault', sẽ luôn có ít nhất một phần tử để bạn có thể viết' First' (ngay cả khi không có không gian bạn sẽ nhận được toàn bộ chuỗi). –

+0

Giải pháp của bạn là chính xác, không cần phải "thử". – Heinzi

2

Các answer of Jamiec là hiệu quả nhất nếu bạn muốn chia chỉ trên không gian. Nhưng, chỉ vì lợi ích của đa dạng, đây là một phiên bản khác:

var FirstWord = "Hello World".Split(null, StringSplitOptions.RemoveEmptyEntries)[0]; 

Như một phần thưởng này cũng sẽ nhận ra all kinds of exotic whitespace characters và sẽ bỏ qua nhiều ký tự khoảng trắng liên tiếp (trong thực tế nó sẽ cắt hàng đầu/dấu khoảng trắng từ kết quả) .

Lưu ý rằng nó cũng sẽ tính các ký hiệu là chữ cái, vì vậy nếu chuỗi của bạn là Hello, world!, nó sẽ trả về Hello,. Nếu bạn không cần điều đó, sau đó chuyển một mảng ký tự dấu tách trong tham số đầu tiên.

Nhưng nếu bạn muốn nó được 100% hoàn hảo trong mọi ngôn ngữ trên thế giới, sau đó nó sẽ trở nên tồi tệ ...

2

shamelessly bị đánh cắp từ trang web MSDN (http://msdn.microsoft.com/en-us/library/b873y76a.aspx)

string words = "This is a list of words, with: a bit of punctuation" + 
    "\tand a tab character."; 

string [] split = words.Split(new Char [] {' ', ',', '.', ':', '\t' }); 

if(split.Length > 0) 
{ 
    return split[0]; 
} 
1

Xử lý các ký tự khoảng trắng khác nhau, chuỗi rỗng và chuỗi từ đơn.

private static string FirstWord(string text) 
{ 
    if (text == null) throw new ArgumentNullException("text"); 

    var builder = new StringBuilder(); 

    for (int index = 0; index < text.Length; index += 1) 
    { 
     char ch = text[index]; 
     if (Char.IsWhiteSpace(ch)) break; 

     builder.Append(ch); 
    } 

    return builder.ToString(); 
}
1

Thay vì làm Split cho tất cả các chuỗi, Hạn chế chia của bạn để đếm của 2. Sử dụng quá tải cũng được tính là tham số.Sử dụng String.Split Method (Char[], Int32)

string str = "hello world"; 
string firstWord = str.Split(new[]{' '} , 2).First(); 

Split sẽ luôn trả về một mảng với ít nhất một yếu tố để một trong hai .[0] hoặc First là đủ.

0

Tôi đã sử dụng chức năng này trong mã của mình. Nó cung cấp một tùy chọn để viết hoa từ đầu tiên hoặc mỗi từ đơn lẻ.

 public static string FirstCharToUpper(string text, bool firstWordOnly = true) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(text)) 
      { 
       return text; 
      } 
      else 
      { 
       if (firstWordOnly) 
       { 
        string[] words = text.Split(' '); 
        string firstWord = words.First(); 
        firstWord = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(firstWord.ToLower()); 
        words[0] = firstWord; 
        return string.Join(" ", words); 
       } 
       else 
       { 
        return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text.ToLower()); 
       } 
      } 
     } catch (Exception ex) 
     { 
      Log.Exc(ex); 
      return text; 
     } 
    }