2

我正在检索文件的字符串数组,我想通过文件名中的子字符串对它们进行自定义排序...使用 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# 菜鸟,我不知道从哪里开始。基本上,我在文件名中寻找一个子字符串来确定顺序(例如,“index”、“reference”、“list”;其中包含字符串“index”的任何文件都将首先列出)。也许有更好的方法来做到这一点。任何帮助,将不胜感激。

4

2 回答 2

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

于 2013-08-12T21:07:43.533 回答
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());

和输出

在此处输入图像描述

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

于 2013-08-12T20:59:53.597 回答