Сетка обновление от исходной иерархии


На этот вопрос я ответил с помощью LINQ. В то время как он делает то, что я искал, я не уверен, насколько легко в запросы LINQ для подражания. Поэтому я ищу обратную связь на форматирование, что замечания будут полезны и другие альтернативные подходы к перемещению через детей записи.

    private void UpdateGridFromSourceHierarchy(int depth, IEnumerable<SourceFile> list)
    {

        //Get the initial set of sourcefiles
        var sourceFiles = list
            .SelectMany(current => current.getInvocations()
                                .Select(invocation => new {current = (SourceFile) null, invocation}))
            .ToList() //This ensures that getInvocations is only called once for each sourcefile
            .GroupBy(x => x.current, x => x.invocation);

        for (var currentDepth = 0; currentDepth <= depth; currentDepth++)
        {
            foreach (var currentGroup in sourceFiles)
            {
                int sourceFileCount = currentGroup.Count();
                int counter = 0;

                foreach (var invocation in currentGroup)
                {
                    /*
                     * Generalized grid code goes here
                     * In my code it was a call to:
                     * UpdateGridPosition(currentGroup,invocation,counter);
                     */
                    counter++;
                }
            }

            //Select the current sub source files
            sourceFiles = sourceFiles.SelectMany(current => current.Select(invocation => invocation))
                //Get all of the invocations paired with the new current level of source files
                .SelectMany(newCurrent => newCurrent.getInvocations()
                                     .Select(invocation => new { newCurrent, invocation }))
                //Group them so that we can loop through each set of invocations seperately
                .ToList().GroupBy(x => x.newCurrent, x => x.invocation);
        }
    }


1038
9
задан 24 января 2011 в 06:01 Источник Поделиться
Комментарии
2 ответа

Нет

Ваш код выглядит довольно сумбурно и, что последнее заявление LINQ-это просто убийца. В довершение тройного вложенного оператора foreach выглядит как серьезный код. Я предлагаю ломать свой код на более мелкие методы, что каждая делать одно, которое может уменьшить воспринимаемая сложность его

4
ответ дан 25 января 2011 в 07:01 Источник Поделиться

Я решил поработать немного на второй запрос LINQ и вот что я придумал:

                //Select the current sub source files             
sourceFiles = GetNextSourceFileLevel(sourceFiles);
}
}

private IEnumerable<IGrouping<SourceFile, SourceFile>> GetNextSourceFileLevel(IEnumerable<IGrouping<SourceFile, SourceFile>> sourceFiles)
{
var previousLevelOfSourceFiles = sourceFiles.SelectMany(current => current.Select(invocation => invocation));

var previousLevelOfSourceFilesWithInvocations = previousLevelOfSourceFiles
.SelectMany(newCurrent => newCurrent.getInvocations()
.Select(invocation =>new {newCurrent, invocation}));
var listOfSourceFiles = previousLevelOfSourceFilesWithInvocations.ToList();

return listOfSourceFiles.GroupBy(x => x.newCurrent, x => x.invocation);
}

Я думал о том, чтобы каждый цикл в метод в свой собственный метод, и разбились на более мелкие шаги, я мог бы пойти дальше, но не хочу иметь, чтобы создать класс анонимной, который я использовал.

1
ответ дан 25 января 2011 в 01:01 Источник Поделиться