|
今天看了一天的LINQ,給自己布置一個問題:用LINQ遍歷一個指定目錄并輸出為XML
寫出的代碼如下:
public static XElement ToXml(this DirectoryInfo dir)
{
XElement root = new XElement("Dir",
new XAttribute("Name", dir.Name),
from subDir in dir.GetDirectories()
select DirToXml(subDir),
from file in dir.GetFiles()
select new XElement("File", file.Name));
return root;
}
使用的時候,你可以這樣:
DirectoryInfo dir = new DirectoryInfo(path);
XElement dirXml = dir.ToXml();
OK,搞定。
可以看出,LINQ非常強大,既然這么強大,為什么不更進一步呢?
我要遍歷一下目錄里的制定格式的文件應該怎么做呢?
比如說我要找出目錄里的所有的mp3
于是可以寫出這樣的代碼
public static XElement ToXml(this DirectoryInfo dir, string searchPattern)
{
XElement root = new XElement("Dir",
new XAttribute("Name", dir.Name),
from subDir in dir.GetDirectories()
select DirToXml(subDir),
from file in dir.GetFiles(searchPattern)
select new XElement("File", file.Name));
return root;
}
使用的時候是這樣
DirectoryInfo dir = new DirectoryInfo(path);
XElement dirXml = dir.DirToXml("*.mp3");
輕松搞定
更進一步,如果我要找多個格式的文件呢?比如說要找出目錄里面的圖片文件(jpg, bmp, gif…)
Ok,沒問題,可以寫成這樣:
public static XElement ToXml(this DirectoryInfo dir, string[] searchPatterns)
{
XElement root = new XElement("Dir",
new XAttribute("Name", dir.Name),
from subDir in dir.GetDirectories()
select DirToXml(subDir),
from pattern in searchPatterns
from file in dir.GetFiles(pattern)
select new XElement("File", file.Name));
return root;
}
使用的時候可以這樣:
DirectoryInfo dir = new DirectoryInfo(path);
XElement dirXml = dir.DirToXml(new[] { "*.mp3", "*.txt" });
Ok,又搞定了。
為什么我要寫三個函數呢?我把三個合并成一個可以嗎?試試看吧
于是,代碼就成了這樣:
public static XElement ToXml(this DirectoryInfo dir, params string[] searchPatterns)
{
XElement root = new XElement("Dir",
new XAttribute("Name", dir.Name),
from subDir in dir.GetDirectories()
select DirToXml(subDir),
searchPatterns.Length > 0 ?
(from pattern in searchPatterns.Distinct()
from file in dir.GetFiles(pattern)
select new XElement("File", file.Name))
:
(from file in dir.GetFiles()
select new XElement("File", file.Name)));
return root;
}
測試一下,perfect!
美中不足的是,在代碼中的一個(searchPatterns.Length > 0 ?)就像一個刀疤,有誰有什么好些的主意嗎?
it知識庫:用LINQ遍歷目錄(原創),轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。