Skip to main content

Since you're using C#, you can make your initializers a bit nicer:

Grid g = new Grid()
{
    Width = 50,
    Height = 50,
    Tag = focus,
}
//Canvas.SetZIndex(g, 100);

The last part of your code (or rather, the second half) does very similar things multiple times: code duplication is a sign your code can be made clearer. For instance (note that your code almost surely contains a bug! The statement inside all the loops invokes s2 and not s3):

foreach (SourceFile s in list)
{
    foreach (SourceFile source in s.getInvocations())
    {
        foreach (SourceFile s1 in source.getInvocations())
        {
            foreach (SourceFile s2 in s1.getInvocations())
            {
                foreach (SourceFile s3 in s2.getInvocations())
                {
                    invoCount = invoCount + s2.getInvocations().Count;
                }
            }
        }
    }
}

can be changed into

list.CountRecursive(t => t.getInvocations(), t => t.getInvocations().Count, 5);

(...)

public static int CountRecursive<T>(this IEnumerable<T> x, Func<T, IEnumerable<T>> f, Func<T, int> c, int depth)
{
    int counter = 0;
    foreach (T t in x)
    {
        if (depth > 1)
        {
            counter += f(t).CountRecursive(f, c, depth - 1);
        }
        else
        {
            counter += c(t);
        }
    }
    return counter;
}

which also makes it a lot easier to do it for different recursion levels.