[英]C# list of files name comparison
對於我的編碼技巧,我有一個簡單但非常艱巨的任務。
基本上我有一個任務來解析特定文件夾中的所有文件名(這執行正常)但我必須比較這些文件名並選擇文件名特定部分中具有最新(最大)編號的文件名。 一個例子:
0074-105-NVK.1.p7.ver.1.pdf
0074-105-NVK.1.p7.ver.2.pdf
0074-105-NVK.1.p7.ver.3.pdf
我感興趣的部分是“ ver.1 ”,程序應選擇最高的那個並刪除其他文件。 我真的不知道如何實現這個文件名比較。
我建議在正則表達式的幫助下提取版本信息並按此版本排序:
string[] files = new string[] {
"0074 - 105 - NVK.1.p7.ver.1.pdf",
"0074 - 105 - NVK.1.p7.ver.2.pdf",
"0074 - 105 - NVK.1.p7.ver.3.pdf", };
string pattern = @"ver\.(?<version>[0-9]+(\.[0-9]+)*)[^0-9]+$";
var result = files
.Select(file => new {
name = file,
ver = new Version(Regex.Match(file, pattern).Groups["version"].Value + ".0")
})
.OrderByDescending(item => item.ver)
.Select(item => item.name)
.FirstOrDefault();
您可以使用以下命令獲取所有文件名:
string[] fileNames = Directory.GetFiles(@"d:\Dir\", "*.pdf").ToList();
List<string> nameOnly = new List<string>();
List<KeyValuePair<string, string>> bind = new List<KeyValuePair<string, string>>();
一旦列表中包含所有文件名,您就可以將擴展名排除為:
foreach(var item in fileNames)
{
var x = Regex.Match(item, @".*(?=\.)").Value;
nameOnly.Add(x);
}
僅用於將每個名稱與其文件名綁定:
foreach(var item in nameOnly)
{
var x = Regex.Match(item, @".*(?=\.)").Value;
bind.Add(new KeyValuePair<string, string>(x,item));
}
您可以使用最大數字獲取最終文件名:
var max = bind.OrderBy(x => x.Key);
var fileName = max.LastOrDefault().Value;
使用單個lambda行可以很好地完成它:
var s1 = "0074-105-NVK.1.p7.ver.1.pdf";
var s2 = "0074-105-NVK.1.p7.ver.2.pdf";
var s3 = "0074-105-NVK.1.p7.ver.3.pdf";
var arr = new[] {s1, s2, s3};
var latestVer = arr.OrderBy(s => int.Parse(s.Split('.')[s.Split('.').Length - 2])).Last();
你應該在數組或列表中有文件名:
var fileNames = new List<string>();
// fill list with proper file names
在回復您的示例時,您可以對此列表進行排序(假設只有ver.x可以更改):
list.Sort(); // you can use parametrized method which sort by part of string
您還可以使用SortedList(您已自動排序):
var fileNames = new SortedList<string>();
fileNames.Add(fileName.Substring(18), fileName);
或者你可以使用Linq:
var sorted = fileNames.OrderBy(item => item.Substring(18)); // in that case you can use different parts of file name)
試試這段代碼:
string[] files = new string[] {
"0074 - 105 - NVK.1.p7.ver.1.pdf",
"0074 - 105 - NVK.1.p7.ver.11.pdf",
"0074 - 105 - NVK.1.p7.ver.2.pdf", };
var result = files.Select(f => new
{
name = f,
ver = int.Parse((f.Substring(f.IndexOf(".ver") + 1).Split('.')[1]))
})
.OrderByDescending(x => x.ver)
.Select(x => x.name)
.FirstOrDefault();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.