2010-03-08 10 views
11

Mam zbiór słów i chcę stworzyć kolekcję z tej kolekcji ograniczony do 5 znakówpodciąg z linq?

Wejście:

Car 
Collection 
Limited 
stackoverflow 

wyjściowa:

car 
colle 
limit 
stack 

word.Substring (0, 5) zgłasza wyjątek (długość)

słowo.Take (10) nie jest dobrym pomysłem, zbyt ...

Jakieś dobre pomysły?

+6

Otrzymujesz wyjątek, ponieważ samochód ma tylko 3 znaki i prosisz o SubString składający się z 5 znaków. –

+0

tak, wiem. Sytuacja jest znacznie bardziej skomplikowana, a to, co wam opisałem, ma największy problem, który stanowi tę skomplikowaną sytuację :) – user278618

+0

Tak fajny jak LINQ (i naprawdę myślę, że jest fajny), jak go używać do tego lepszego/bardziej czytelnego niż "staroświecka" pętla foreach? – JMarsch

Odpowiedz

22

LINQ do obiektów dla tego scenariusza? Możesz wybrać jedną z następujących opcji:

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

Zasadniczo?: Omawia ten problem.

+3

Powinieneś dodać sprawdzenie elementów 'null'. Oznacza to, że 'var subwords = words.Where (w => w! = Null). Wybierz (w => w.Length> 5? W. Podciąganie (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

coś można zrobić, to

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

wierzę rodzaj odpowiedzi szukałeś będzie wyglądać następująco:

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

Zmienna „wyjście” zawiera wynik :

car 
Colle 
Limit 
stack 

a a ciąg "samochód" nie rzuca wyjątku.

Ale jednocześnie Dołącz i Take (5) działa, to na ogół znacznie prostszy w obsłudze, jak sugerowano w innej odpowiedzi,

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

Drugi kod jest bardziej czytelny dla człowieka i lekki, choć nie jest z pewnością niewielki współczynnik chłodu, aby użyć Linq na ciągu znaków, aby uzyskać pierwszych pięć znaków, bez konieczności sprawdzania długości napisu.