2010-04-26 50 views
7

Bằng cách nào đó tôi dường như không thể thay thế chuỗi trong vòng lặp foreach trong C# để hoạt động. Mã của tôi là như sau:C# string.replace trong vòng lặp foreach

foreach (string s in names) 
{ 
    s.Replace("pdf", "txt"); 
} 

Am vẫn còn khá mới để LINQ để tha thứ cho tôi nếu điều này nghe có vẻ nghiệp dư;)

Trả lời

30

Bạn nói rằng bạn đang sau một giải pháp LINQ ... đó là dễ dàng:

var replacedNames = names.Select(x => x.Replace("pdf", "txt")); 

Chúng tôi không biết loại names, nhưng nếu bạn muốn gán lại nó bạn có khả năng có thể sử dụng ToArray hoặc ToList:

// If names is a List<T> 
names = names.Select(x => x.Replace("pdf", "txt")).ToList(); 
// If names is an array 
names = names.Select(x => x.Replace("pdf", "txt")).ToArray(); 

bạn nên biết rằng mã mà bạn đã đăng không sử dụng LINQ ở tất cả tại thời điểm mặc dù ...

21

Strings trong C# là không thay đổi (không thay đổi), vì vậy s.Replace sẽ trả về một chuỗi mới . Thật không may điều này có nghĩa là bạn không thể sử dụng foreach để thực hiện cập nhật. Nếu tên là một mảng này nên làm việc:

for(int i = 0; i < names.Length; i++) 
{ 
    names[i] = names[i].Replace("pdf", "txt"); 
} 
+2

Nó cũng sẽ hoạt động cho 'Danh sách '. Chỉ cần thay thế _Length_ bằng _Count_ –

0

s.Replace là một chức năng, do đó bạn muốn s = s.Replace() .. mặc dù nó tốt hơn để sử dụng StringBuilder. (Xem câu trả lời phía trên)

+4

Tại sao sử dụng StringBuilder tốt hơn ở đây? Nó không giống như nhiều thay thế đang được thực hiện trên * cùng * chuỗi. –

3

Vì những người khác đã đề cập bạn cần sử dụng vòng lặp for để thực hiện việc này tại chỗ. Tuy nhiên, nếu bạn không cần thao tác được thực hiện tại chỗ (tức là kết quả có thể là một bộ sưu tập khác), thì bạn cũng có thể thực hiện nó dưới dạng truy vấn LINQ, ví dụ:

var results = from name in names select name.Replace("pdf", "txt"); 

Một điều mặc dù - có vẻ như bạn đang cố gắng thay đổi phần mở rộng của một số tên tệp. Nếu đó là những gì bạn đang cố gắng làm sau đó tôi muốn giới thiệu Path.ChangeExtension được thiết kế đặc biệt cho mục đích này.

var results = from name in names select Path.ChangeExtension(name, "txt"); 
+1

Sử dụng biểu thức truy vấn ở đây có vẻ quá mức cần thiết - nếu bạn chỉ đang thực hiện một lựa chọn duy nhất, tại sao không gọi nó trực tiếp? 1 cho Path.ChangeExtension mặc dù. –

+0

@Jon - Tôi chỉ nghĩ rằng các biểu thức truy vấn trông đẹp hơn và dễ đọc hơn một chút. Tất cả đều biên dịch xuống cùng một mã và nhập một vài ký tự phụ không thực sự làm phiền tôi. Nếu tôi đã làm một cái gì đó mà không thể được thể hiện trong một truy vấn như sử dụng bỏ qua/mất hoặc chuyển đổi sang một danh sách sau đó tôi có thể sử dụng các phương pháp mở rộng trực tiếp. –

+0

Tôi đoán nó chỉ là sở thích cá nhân ... Tôi chắc chắn thích biểu thức truy vấn khi chúng trở nên phức tạp hơn, nhưng nếu bạn chỉ làm một bộ lọc đơn hoặc một phép chiếu đơn, thì chúng dường như là cách trực tiếp để thể hiện điều đó. –

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