如果找不到WITH LINQ,则拆分字符串并设置默认值

时间:2013-05-20 16:00:29

标签: c# linq

我有一个类似的问题而不是这篇文章: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可以做我想做的事吗?

3 个答案:

答案 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方法。