我正在检索文件的字符串数组,我想通过文件名中的子字符串自定义它们...使用C#** .NET 3.5。以下是我正在使用的内容。
<% string[] files = System.IO.Directory.GetFiles("...path..." + pageName + "\\reference\\");
files = String.Join(",", files).Replace("...path...", "").Replace("\\reference\\", "").Replace(pageName, "").Split(new Char[] { ',' });
foreach (String item in files)
{
Response.Write("<a href=" + pageName + "/reference/" + System.IO.Path.GetFileName(item) + " target='_blank'>" + item.Replace("_", " ").Replace(".pdf", " ") + "</a>");
}
%>
我是C#noob,我不知道从哪里开始。基本上,我正在寻找文件名中的子字符串以确定顺序(例如,“index”,“reference”,“list”;其中任何包含字符串“index”的文件将首先列出)。也许有更好的方法来做到这一点。任何帮助,将不胜感激。
答案 0 :(得分:2)
您可以使用Linq按文件名对数组进行排序。通常,如果您正在使用路径,请使用Path
类。
string fullPath = Path.Combine(directory, pageName, "reference");
var filePaths = Directory.EnumerateFiles(fullPath, "*.*", SearchOption.TopDirectoryOnly)
.Select(fp => new{ FullPath = fp, FileName=Path.GetFileName(fp) })
.OrderByDescending(x => x.FileName.IndexOf("index", StringComparison.OrdinalIgnoreCase) >= 0)
.ThenByDescending(x => x.FileName.IndexOf("reference", StringComparison.OrdinalIgnoreCase) >= 0)
.ThenByDescending(x => x.FileName.IndexOf("list", StringComparison.OrdinalIgnoreCase) >= 0)
.ThenBy(x=> x.FileName)
.Select(x => x.FullPath);
foreach(string filePath in filePaths)
;// ...
如果您不想不区分大小写(以便“索引”和“索引”被视为相同),请使用String.Contains
代替String.IndexOf
+ StringComparison.OrdinalIgnoreCase
。< / p>
答案 1 :(得分:1)
这是我遇到这个问题时使用的简单方法。
定义列表中子字符串的顺序。然后对于每个项目,检查以查看包含该项目的第一件事。然后按列表中子字符串的顺序排序。
public class SubStringSorter : IComparer<string>
{
public int Compare(string x, string y)
{
var source = x.ToLowerInvariant();
var target = y.ToLowerInvariant();
var types = new List<string> { "base", "data", "model", "services", "interceptor", "controllers", "directives", "filters", "app", "tests", "unittests" };
var sourceType = types.IndexOf(types.FirstOrDefault(source.Contains));
var targetType = types.IndexOf(types.FirstOrDefault(target.Contains));
return sourceType.CompareTo(targetType);
}
}
要对文件进行排序,请执行
之类的操作var list = new List<string>{ "baseFile", "servicesFile", "this ModElstuff" };
list.Sort(new SubStringSorter());
输出
您甚至可以更进一步,将子字符串排序器作为其构造函数的一部分给予列表,以便您可以将子字符串排序顺序与其他项重用。如果字符串存在于任何上下文中,我发布测试的示例,但如果您对字符串更感兴趣,也可以这样做。