4

我有一个与这篇文章类似的问题:C# string split but it's a bit old and use Regex as solution。

所以这是我的输入(字符串数组)

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 做我想做的事?

4

3 回答 3

10

想想你的查询在“pdf”上做了什么:

a // "pdf"
.Split('.') // new [] { "pdf" } 
.Select(b => string.IsNullOrEmpty(b) ? "unknown":b) // new [] { "pdf" } 
.Last() // "pdf"

任何字符串在拆分后都会有非空元素,无论它是否包含分隔符。

可能你想要这样的东西:

a // "pdf"
.Split('.') // new [] { "pdf" }
.Skip(1) // new [] {}
.DefaultIfEmpty("unknown") // new [] { "unknown" }
.Last() // "unknown"

这应该适用于您的所有情况。

于 2013-05-20T16:04:25.283 回答
1
fileNames.Select(s => Path.GetExtension(s)).Select(e => string.IsNullOrEmpty(e) ? "unknown" : e);
于 2013-05-20T16:04:14.610 回答
1

当你使用 时String.Split,你会得到一个字符串数组。给定的字符串在每次出现指定字符时被分解。如果字符没有出现,你会得到一个长度为 1 的数组。在这种情况下,Last元素实际上是第一个。

虽然使用 LINQ可以做到这一点(处理文件abc.def.exe可能很棘手),但有一种更简单的方法。使用Path.GetExtenstion方法。

于 2013-05-20T16:06:35.623 回答