自定义排序文件名字符串数组

时间:2013-08-12 20:54:08

标签: asp.net arrays string sorting

我正在检索文件的字符串数组,我想通过文件名中的子字符串自定义它们...使用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”的文件将首先列出)。也许有更好的方法来做到这一点。任何帮助,将不胜感激。

2 个答案:

答案 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());

输出

enter image description here

您甚至可以更进一步,将子字符串排序器作为其构造函数的一部分给予列表,以便您可以将子字符串排序顺序与其他项重用。如果字符串存在于任何上下文中,我发布测试的示例,但如果您对字符串更感兴趣,也可以这样做。