繁体   English   中英

如何在LINQ中定义变量?

[英]How can I define variables in 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
            )
    ));

产生这个清单:

txt
txt
txt
doc
xml
xml
html
txt
as

有没有办法让f.IndexOf('.')成为一个变量,以便在更复杂的LINQ查询中我将它定义在一个地方?

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

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

然而,对于您发布我建议你使用特定的场景Path.GetExtension而不是解析字符串自己(例如,你的代码将打破,如果任何文件有.在文件名)。

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

你可以做到这一点

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

如果您不想使用from语法,可以使用Select方法执行类似操作:

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

虽然像Greg一样,我建议使用Path.GetExtension方法。 使用方法,可能像这样:

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

在这种情况下,我真的认为这比建议的linq语句更容易阅读。


要将其写入控制台,您可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM