2010-03-08 8 views
11

Tengo colección de palabras, y quiero crear la colección de esta colección limitado a 5 caracteressubserie con linq?

de entrada:

Car 
Collection 
Limited 
stackoverflow 

Salida:

car 
colle 
limit 
stack 

word.Substring (0, 5) throws exception (longitud)

word.Take (10) tampoco es una buena idea ...

¿Alguna buena idea?

+6

Usted obtiene la excepción porque el automóvil tiene solo 3 caracteres de largo y está solicitando un SubString de 5 caracteres. –

+0

sí, lo sé. La situación es mucho más complicada, y esto que te he descrito tiene un problema mayor que esta complicada situación :) – user278618

+0

Tan genial como LINQ es (y realmente creo que es genial), ¿cómo es usarlo para esto mejor/más legible que un ciclo foreach "anticuado"? – JMarsch

Respuesta

22

¿LINQ a los objetos para este escenario? Puede hacer una selección como en este:

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

Básicamente,?: Le permite solucionar este problema.

+3

Debe agregar un cheque para los elementos 'null'. Es decir, 'var subwords = words.Where (w => w! = Null) .Seleccione (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

algo que puede hacer, es

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

creo que el tipo de respuesta que estabas buscando se vería así:

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

La variable "salida" contiene el resultado :

car 
Colle 
Limit 
stack 

a nd la cadena "coche" no arroja una excepción.

Pero mientras que unan y (5) funciona, por lo general es mucho más sencillo de utilizar, como se sugirió en otra respuesta,

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

Este último código es más legible y ligero, aunque no hay duda un factor de frescura leve al uso de Linq en una cuerda para tomar los primeros cinco caracteres, sin tener que verificar la longitud de la cuerda.