我有以下方法:
private List<string> CreateSegments(string virtualPath)
{
List<string> segments = new List<string>();
int i = virtualPath.IndexOf('/', 1);
while (i >= 0 && i < virtualPath.Length)
{
var segment = virtualPath.Substring(0, i);
if (!string.IsNullOrWhiteSpace(segment))
{
segments.Add(segment);
segments.Add(VirtualPathUtility.Combine(segment, "default"));
}
i = virtualPath.IndexOf('/', i + 1);
}
segments.Add(virtualPath);
segments.Add(VirtualPathUtility.Combine(virtualPath, "default"));
return segments;
}
基本上,它会创建路径段,我将使用这些路径段来检查文件是否存在于任何这些段中。像这样:
string[] extensions = GetRegisteredExtensions();
HttpServerUtilityBase server = HttpContext.Current.Server;
List<string> segments = CreateSegments(virtualPath);
// check if a file exists with any of the registered extensions
var match = extensions.SelectMany(x => segments.Select(s => string.Format("{0}.{1}", s, x)))
.FirstOrDefault(p => System.IO.File.Exists(server.MapPath(p)));
上面所有的代码看起来都可以使用一些清理和优化,但我正在寻找一种方法来使用LINQ
如果可能的话来生成段。
类似:var segments = virtualPath.Split('/').SelectMany(...)
并得到类似于以下的结果:
/path
/path/default
/path/to
/path/to/default
/path/to/file
/path/to/file/default
哪里virtualPath
会包含价值"/path/to/file"
编辑:更改string.Format("{0}/{1}", ...)
为VirtualPathUtility.Combine(..., ...)
有任何想法吗?