2009-11-05 19 views
19

ten kod:Jak zdefiniować zmienne w LINQ?

string[] files = {"test.txt", 
    "test2.txt", 
    "notes.txt", 
    "notes.doc", 
    "data.xml", 
    "test.xml", 
    "test.html", 
    "notes.txt", 
    "test.as"}; 

files.ToList().ForEach(f => Console.WriteLine(
     f.Substring(
      f.IndexOf('.') + 1, 
      f.Length - f.IndexOf('.') - 1 
      ) 
    )); 

produkuje tę listę:

txt 
txt 
txt 
doc 
xml 
xml 
html 
txt 
as 

Czy istnieje jakiś sposób, aby f.IndexOf('.') zmienny tak aby w bardziej złożonych zapytań LINQ Mam to zdefiniowane w jedno miejsce?

+0

Jak mówi Greg Beech, to nie jest LINQ. Przykładowy kod używa funkcji Lambda. Mają pewne nakładanie się funkcji, ale nie są to te same rzeczy. –

+0

I, w tym konkretnym przykładzie, można użyć przeciążenia podłańcucha, które akceptuje tylko indeks startowy podła (http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.80%29.aspx) i zwraca reszta struny. – Groo

Odpowiedz

50

Jeśli były przy użyciu LINQ następnie można użyć słowa kluczowego let zdefiniować zmienną inline (kod zamieszczonych w pytaniu nie jest faktycznie przy użyciu LINQ).

var ext = from file in files 
      let idx = f.LastIndexOf('.') + 1 
      select file.Substring(idx); 

Jednak dla określonego scenariusza już pisał polecam korzystania Path.GetExtension zamiast analizowania ciąg siebie (na przykład kod pęknie, jeśli któryś z plików posiada . w nazwie pliku).

var ext = from file in files select Path.GetExtension(file).TrimStart('.'); 
foreach (var e in ext) 
{ 
    Console.WriteLine(e); 
} 
9

Można to zrobić

files.ToList().ForEach(f => { var i = f.IndexOf('.'); 
    Console.WriteLine(f.Substring(i + 1, f.Length - i - 1));} 
); 
2

Jeśli nie chcesz korzystać z from rodzaj składni, można zrobić coś podobnego z metodą Select:

var extensions = files 
     .Select(x => new { Name = x, Dot = x.IndexOf('.') + 1 }) 
     .Select(x => x.Name.Substring(x.Dot)); 

Chociaż, jak Greg, polecam stosując metodę Path.GetExtension . Oraz metod, które mogłyby podoba tak:

var extensions = files 
     .Select(x => Path.GetExtension(x)); 

I w tym przypadku naprawdę myślę, że jest o wiele łatwiejsze do odczytania niż sugerowane sprawozdania LINQ.


pisać je do konsoli, można to zrobić:

extensions 
    .ToList() 
    .ForEach(Console.WriteLine); 
Powiązane problemy