2010-03-08 29 views
11

Tôi đã có bộ sưu tập các lời nói, và tôi muốn tạo bộ sưu tập từ bộ sưu tập này giới hạn 5 charschuỗi con với LINQ?

Input:

Car 
Collection 
Limited 
stackoverflow 

Output:

car 
colle 
limit 
stack 

word.Substring (0, 5) ném ngoại lệ (chiều dài)

từ.Take (10) cũng không phải là ý tưởng hay ...

Bất kỳ ý tưởng hay nào ??

+6

Bạn nhận được ngoại lệ vì ô tô chỉ dài 3 ký tự và bạn đang yêu cầu SubString gồm 5 ký tự. –

+0

vâng, tôi biết. Tình hình phức tạp hơn nhiều, và điều này tôi đã mô tả cho bạn có một vấn đề lớn nhất mà tình huống phức tạp này :) – user278618

+0

Thật thú vị như LINQ (và tôi thực sự nghĩ nó thật tuyệt), cách sử dụng nó tốt hơn/dễ đọc hơn hơn vòng lặp foreach "cũ kỹ"? – JMarsch

Trả lời

22

LINQ cho các đối tượng cho trường hợp này? Bạn có thể chọn một trong các tùy chọn sau:

from w in words 
select new 
{ 
    Word = (w.Length > 5) ? w.Substring(0, 5) : w 
}; 

Về cơ bản,?: Giúp bạn giải quyết vấn đề này.

+3

Bạn nên thêm một kiểm tra cho các phần tử 'null'. Nghĩa là, 'var subwords = words.Where (w => w! = Null) .Chọn (w ​​=> w.Length> 5? W.Substring (0, 5): w);'. – jason

7
var words = new [] { "Car", "Collection", "Limited", "stackoverflow" }; 
IEnumerable<string> cropped = words.Select(word => 
            word.Substring(0, Math.Min(5, word.Length))); 
1

Something bạn có thể làm, là

string partialText = text.Substring(0, Math.Min(text.Length, 5)); 
0

tôi tin rằng các loại câu trả lời bạn đang tìm kiếm sẽ trông như thế này:

var x = new string[] {"car", "Collection", "Limited", "stackoverflow" }; 
var output = x.Select(word => String.Join("", word.Take(5).ToList())); 

Biến "đầu ra" chứa kết quả :

car 
Colle 
Limit 
stack 

a nd chuỗi "xe" không ném một ngoại lệ.

Nhưng trong khi tham gia và Take (5) hoạt động, nó thường đơn giản hơn nhiều để sử dụng, như đã được đề xuất trong câu trả lời khác,

subString = word.Substring(0,Math.Min(5,word.Length)); 

Mã thứ hai là do con người dễ đọc hơn và nhẹ, mặc dù có chắc chắn là một yếu tố mát mẻ nhẹ để sử dụng LINQ trên một chuỗi để lấy năm ký tự đầu tiên, mà không cần phải kiểm tra độ dài của chuỗi.