Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing method in a functional style

Tags:

c#

linq

I have the following method:

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;
}

Basically, it creates path segments which I will use to check if a file exists in any of those segments. Like this:

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)));

All the above code looks like it could use some clean up and optimization, but I'm looking for a way to use LINQ if possible to generate the segments.

Something like: var segments = virtualPath.Split('/').SelectMany(...) and get a result similar to the following:

/path
/path/default
/path/to
/path/to/default
/path/to/file
/path/to/file/default

Where virtualPath would contain the value "/path/to/file"

EDIT: Changed string.Format("{0}/{1}", ...) to VirtualPathUtility.Combine(..., ...)

Any ideas?

like image 879
Alfero Chingono Avatar asked Aug 29 '26 09:08

Alfero Chingono


1 Answers

One way would be to incrementally select the path segments, then "join" it with an empty string and "/default" to get the two variations:

string path = @"/path/to/file";

string temp = "";

var query = path.Split('/')
                .Where(s => !string.IsNullOrEmpty(s))
                .Select((p) => {temp += ("/" + p); return temp;} )
                .SelectMany(s => new[]{"","/default"}.Select (d => s + d) );
like image 199
D Stanley Avatar answered Sep 01 '26 08:09

D Stanley