我有一个类似的问题而不是这篇文章:C# string splitting但它有点陈旧并使用Regex作为解决方案。
所以这是我的输入(字符串数组)
foo.xml
bar.png
pdf
我想要的是检索没有点的文件扩展名,并在没有找到点时设置“未知”。
xml
png
unknown
我尝试的不起作用
_filesName.Select(a => a.Split('.').Select(b => string.IsNullOrEmpty(b) ? "unknown":b).Last());
返回
xml
png
pdf // WRONG!! Why its not set to unknown?
使用LINQ可以做我想做的事吗?
答案 0 :(得分:10)
考虑一下您的查询对“pdf”的作用:
a // "pdf"
.Split('.') // new [] { "pdf" }
.Select(b => string.IsNullOrEmpty(b) ? "unknown":b) // new [] { "pdf" }
.Last() // "pdf"
任何字符串在Split后都将具有非null元素,无论它是否包含分隔符。
可能你想要这样的东西:
a // "pdf"
.Split('.') // new [] { "pdf" }
.Skip(1) // new [] {}
.DefaultIfEmpty("unknown") // new [] { "unknown" }
.Last() // "unknown"
这应该适用于所有情况。
答案 1 :(得分:1)
fileNames.Select(s => Path.GetExtension(s)).Select(e => string.IsNullOrEmpty(e) ? "unknown" : e);
答案 2 :(得分:1)
使用String.Split
时,会得到一个字符串数组。给定的字符串在每次出现指定字符时被分解。如果没有出现该字符,则会得到一个长度为1的数组。在这种情况下,Last
元素实际上是第一个。
虽然可能可以使用LINQ执行此操作(处理abc.def.exe
等文件可能会很棘手),但有一种更简单的方法。使用Path.GetExtenstion
方法。