2009-11-05 10 views
19

este código:¿Cómo puedo definir variables en 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 
      ) 
    )); 

produce esta lista:

txt 
txt 
txt 
doc 
xml 
xml 
html 
txt 
as 

¿Hay alguna manera de hacer f.IndexOf('.') una variable de modo que en las consultas LINQ más complejos esto he definidos en ¿un lugar?

+0

Como dice Greg Haya, esto no es LINQ. El código de ejemplo usa una función Lambda. Tienen cierta superposición en la funcionalidad, pero no son las mismas cosas. –

+0

Y, en este ejemplo concreto, puede usar la sobrecarga de subcadena que solo acepta el índice de inicio de subcadena (http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.80%29.aspx) y devuelve el resto de la cadena. – Groo

Respuesta

50

Si estaba utilizando LINQ entonces se podría utilizar la palabra clave let para definir una variable de línea (el código publicado en la pregunta no es en realidad el uso de LINQ).

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

Sin embargo, para el escenario específico que has enviado me gustaría recomendar el uso Path.GetExtension en lugar de analizar la cadena a sí mismo (por ejemplo, el código se romperá si alguno de los archivos tienen una . en el nombre del archivo).

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

Usted puede hacer esto

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

Si no desea utilizar el tipo de sintaxis from, se puede hacer algo similar con el método de Select:

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

Aunque, al igual que Greg, yo recomendaría usar el método Path.GetExtension . Y con métodos, que podrían recibir de esta manera:

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

Y en este caso realmente creo que es mucho más fácil de leer que las declaraciones de LINQ sugeridas.


Para escribir a la consola, se puede hacer esto:

extensions 
    .ToList() 
    .ForEach(Console.WriteLine); 
Cuestiones relacionadas