此代码:
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查询中我将其定义在一个地方?
答案 0 :(得分:54)
如果您使用的是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);
}
答案 1 :(得分:9)
你可以这样做
files.ToList().ForEach(f => { var i = f.IndexOf('.');
Console.WriteLine(f.Substring(i + 1, f.Length - i - 1));}
);
答案 2 :(得分:2)
如果您不想使用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);