如何在LINQ中定义变量?

Edw*_*uay 22 c# 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
            )
    ));
Run Code Online (Sandbox Code Playgroud)

产生这个清单:

txt
txt
txt
doc
xml
xml
html
txt
as
Run Code Online (Sandbox Code Playgroud)

有没有办法建立f.IndexOf('.')一个变量,以便在更复杂的LINQ查询中,我在一个地方定义了这个?

Gre*_*ech 55

如果您使用的是Linq,那么您可以使用let关键字来定义内联变量(问题中发布的代码实际上并未使用Linq).

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

但是对于您发布的特定场景,我建议您使用Path.GetExtension而不是自己解析字符串(例如,如果.文件名中包含任何文件,则代码将中断).

var ext = from file in files select Path.GetExtension(file).TrimStart('.');
foreach (var e in ext)
{
    Console.WriteLine(e);
}
Run Code Online (Sandbox Code Playgroud)

  • 不应该是“let idx = file.LastIndexOf”吗?'f' 没有在任何地方定义。 (3认同)

Bri*_*sen 9

你可以做到这一点

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