2013-05-20 1 views
3

У меня есть аналогичный вопрос, чем этот пост: C# string splitting, но он немного старый и использует Regex в качестве решения.Разделите строку и установите значение по умолчанию, если разделитель не найден WITH LINQ

Так вот мой вход (массив строки)

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

Как выглядит объект '_filesName'? Вы можете использовать [Path.GetExtension] (http://msdn.microsoft.com/en-us/library/system.io.path.getextension.aspx) – DGibbs

+0

filesName - это строка [], она была извлечена из файла xml – Gui

ответ

9

Подумайте о том, что ваш запрос делает на «PDF»:

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

Любая строка будет иметь ненулевые элементы после того, как Split, содержит ли он разделитель или нет.

Возможно, вы хотите что-то вроде этого:

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

Это должно работать на всех ваших дел.

+2

+1 за отличное объяснение – ean5533

+2

@ Jim Как так? '" appname.exe.config ".Split ('.') == new [] {" appname "," exe "," config "}'; последний элемент этого «config», как и ожидалось. – kevingessner

+0

привет, ваше решение прекрасно работает. Большое спасибо. – Gui

1
fileNames.Select(s => Path.GetExtension(s)).Select(e => string.IsNullOrEmpty(e) ? "unknown" : e); 
+0

'Path.GetExtension' включает в себя ведущий«. ». на расширении - вы захотите снять это, чтобы получить желаемый результат. – kevingessner

1

Когда вы используете String.Split, вы получаете массив строк. Указанная строка разбивается при каждом появлении указанного символа. Если символ не встречается, вы получаете массив длины 1. В этом случае элемент Last фактически является первым.

Хотя это может можно сделать это с помощью LINQ (обработка файлов, таких как abc.def.exe, может быть сложной), есть более простой способ. Используйте метод Path.GetExtenstion.

Смежные вопросы