2012-10-03 28 views
6

Câu hỏi này chỉ dành cho mục đích học tập.Tham gia chuỗi [] Nếu không sử dụng chuỗi.Join

Giả sử tôi có đoạn mã sau ...

var split = line.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries); 
var elem = new XElement("shop"); 
elem.SetAttributeValue("name", split.Take(split.Length - 1)); <===== 
elem.SetAttributeValue("tin", split.Last()); 

Và tôi muốn các phù hợp với mũi tên để tạo ra kết quả tương tự như thế này ...

string.Join(string.Empty, split.Take(split.Length - 1)); 

... mà không cần sử dụng string.Join.

Điều đó có khả thi không? Tôi dường như không thể tìm thấy một tuyên bố LINQ để làm điều đó ... hy vọng bạn đã biết!

+2

Thú vị câu trả lời, nhưng tôi tò mò, được lý do tại sao bạn đang tìm kiếm một cách tiếp cận khác nhau hơn string.Join? Và cũng có thể, bạn nói rằng bạn đang tìm kiếm một câu lệnh Linq, nhưng sau đó câu trả lời được chấp nhận của bạn (một câu trả lời hay) không sử dụng LINQ chút nào :) – Wasp

+0

@Wasp, một lần nữa câu hỏi là học tập. Hơn nữa, tôi có nghĩa là __not__ để nói rằng tôi yêu cầu nó được giải quyết thông qua LINQ, nhưng nhiều hơn vì vậy mà tôi đã tìm kiếm một tuyên bố LINQ để làm điều đó bởi vì tôi ___thought đó là cách tiếp cận tốt nhất. Tuy nhiên, cuối cùng, Guffa chỉ cho tôi một cách hoàn hảo hơn. –

+1

Vì vậy, câu hỏi _should_ đã được - làm thế nào tôi có thể bỏ qua đoạn cuối cùng của chuỗi này và loại bỏ các dấu phẩy. Bạn đã may mắn và nhận được câu trả lời bạn _needed_, nhưng không phải là câu trả lời bạn _asked for_. –

Trả lời

4

Không sử dụng Split một trong hai, chỉ cần xác định vị trí các dấu phẩy cuối cùng và sử dụng Substring để chia chuỗi:

int pos = line.LastIndexOf(','); 
var elem = new XElement("shop"); 
elem.SetAttributeValue("name", line.Substring(0, pos).Replace(",", String.Empty)); 
elem.SetAttributeValue("tin", line.Substring(pos + 1)); 
+0

Câu trả lời rất hay và cách tiếp cận tốt nhất tổng thể. Tôi sẽ chỉnh sửa câu trả lời của bạn với giải pháp tổng thể của tôi vì yêu cầu mới được cắt xén và tôi muốn mọi người nhìn thấy nó (trường 'name' có thể có dấu phẩy trong đó mặc dù họ đang gửi tệp qua CSV, có lẽ nên sử dụng một delimiter tốt hơn huh?) –

+0

@ Mike: Phải, bạn đã tham gia các chuỗi không có dấu phẩy. Bạn chỉ có thể xóa chúng khỏi chuỗi đầu tiên bằng 'Thay thế'. – Guffa

+0

Tôi đã sai! Tôi không phải sửa đổi nó vì chỉ có hai giá trị và bạn đã chạy chuỗi con đến vị trí LAST mỗi lần. Rất, rất, rất tốt giải pháp và nó cực kỳ hiệu quả là tốt! –

2

thế nào về

split.Take(split.Length - 1).Aggregate((s1,s2)=> s1 + s2); 

hoặc tương đương phi LINQ:

string s = ""; 
for(int i = 0; i < split.Length - 1; i++) 
{ 
    s += split[i]; 
} 
return s; 
+0

Điều này là đúng, nhưng hiệu suất là bậc hai. –

+0

Rất chậm ... – SimpleVar

+1

+1… @YoryeNathan, đây là giải pháp hoàn toàn có thể chấp nhận được. Thời gian chạy bậc hai, đúng, nhưng đối với trường hợp sử dụng có thể vẫn * nhanh hơn * so với giải pháp sử dụng 'StringBuilder': xem mã OP được sử dụng để đặt giá trị thuộc tính XML gọi là' name' - bạn mất bao lâu mong đợi bộ sưu tập được? –

6

Sử dụng một StringBuilder cho O (n) thực hiện:

split 
    .Take(split.Length - 1) 
    .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString(); 

Nếu đối tượng là để tránh sự lúng túng của một cây kết hợp các cuộc gọi LINQ và các phương pháp tĩnh, sau đó một giải pháp đơn giản là một exte phương pháp nsion:

public static string Join(this IEnumerable<string> self, string separator = "") 
{ 
    return string.Join(separator, self); 
} 

Và sau đó:

split.Take(split.Length - 1).Join(); 

Tôi tìm thấy điều này để đọc tốt hơn nhiều so với sử dụng string.Join trong các biểu thức phức tạp.

+0

+1 cho giải pháp tốt –

0
var strs = new string[100]; 
... 

var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)), 
          (sb, curr) => sb.Append(s + ", ")).ToString(); 

Chỉ cần xóa "" cuối cùng từ cuối.

+0

Cho phép kích thước 'StringBuilder' tạo ra tăng tốc, nhưng không phải là một tốc độ tiệm cận. Điều này có thể ít hơn chi phí từ 'Sum'. –

+0

Đáng giá séc .. – SimpleVar

0
string myString = "Hello World" 
var myList= new List<int>(); 

for (int i = 0; i < 10; i++) 
    myList.Add(i); 

var newList = myList.Aggregate(string.Empty, (current, num) => current + myString.Substring(num, 1)); 
Các vấn đề liên quan