Как преобразовать приведенные ниже 2 вложенных цикла foreach в запрос linq?

Как преобразовать приведенные ниже 2 вложенных цикла foreach в запрос LINQ? Выполнение этого цикла, содержащего около 610 элементов, занимает около 10 секунд. Кроме того, есть ли какие-либо обновления для строк кода ниже, которые можно изменить, чтобы производительность и можно было немного улучшить, а время выполнения можно было сократить?

Код:

foreach(var map in infoMap)
{
    var testItem = map.TestItem;
    var testInViews = TestviewMaps;
    var testWorkbenchItem = map.TestWorkbenchItem;
    string TestLinkType = string.Empty;
    WorkItemLinkCollection testLinkedWorkItems = testItem.WorkItemLinkHistory;
    if (linkedWorkItems != null && linkedWorkItems.Count > 0)
        TestLinkType = linkedWorkItems[0].LinkTypeEnd.LinkType.ReferenceName;
    else if (testItem != null)
        TestLinkType = testItem.Store.WorkItemLinkTypes.LinkTypeEnds["Parent"].LinkType.ReferenceName;
    foreach (var testViewMap in testInViews)
    {
        if (!string.IsNullOrEmpty(TestLinkType))
        {
            var testLinkName = TestLinkType;
            var testChildType = testViewMap.ChildType;

            ITestLinkItem testItm = Factory.BuildLinkItem(testLinkName,testWorkbenchItem,testWorkbenchItem);
            lock (TestAddparents)
            {
                TestAddparents.Add(testItm);
            }
            break;
        }
    }
}

person John Stephen    schedule 17.02.2014    source источник
comment
LINQ — это не черная магия, которая мгновенно ускорит работу вашего кода.   -  person ken2k    schedule 17.02.2014
comment
@ken2k, Или как-то иначе, можно ли сократить время выполнения кода.   -  person John Stephen    schedule 17.02.2014
comment
@ken2k - на самом деле есть несколько сообщений, выполнение кода LINQ займет больше времени из-за возможностей, которые он предлагает, чем более конкретного для каждого запроса.   -  person peter    schedule 17.02.2014


Ответы (1)


Ответить на собственно вопрос (по комментариям) - как улучшить производительность, совершенно невозможно, если мы не знаем причину кода.

Но есть некоторые вещи, которые я заметил:

  1. у вас есть условие if в вашем цикле, которое никогда не меняется if (!string.IsNullOrEmpty(TestLinkType)) => выньте его
  2. вы проходите через цикл только один раз, так почему, во-первых, имея цикл, просто получите первый элемент.

Новый код может выглядеть так:

    foreach(var map in infoMap)
    {
        var testItem = map.TestItem;
        var testInViews = TestviewMaps;
        var testWorkbenchItem = map.TestWorkbenchItem;
        string TestLinkType = string.Empty;
        WorkItemLinkCollection testLinkedWorkItems = testItem.WorkItemLinkHistory;
        if (linkedWorkItems != null && linkedWorkItems.Count > 0)
            TestLinkType = linkedWorkItems[0].LinkTypeEnd.LinkType.ReferenceName;
        else if (testItem != null)
            TestLinkType = testItem.Store.WorkItemLinkTypes.LinkTypeEnds["Parent"].LinkType.ReferenceName;

        if (!string.IsNullOrEmpty(TestLinkType))
        {
            var testViewMap = testInViews.FirstOrDefault();

            if (testViewMap != null)
            {
                var testLinkName = TestLinkType;
                var testChildType = testViewMap.ChildType;

                ITestLinkItem testItm = Factory.BuildLinkItem(testLinkName,testWorkbenchItem,testWorkbenchItem);
                lock (TestAddparents)
                {
                    TestAddparents.Add(testItm);
                }                    
            }
        }
    }

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

person peter    schedule 17.02.2014
comment
Кроме того, я использовал Parallel.ForEach вместо ForEach, и теперь для выполнения приведенного выше кода требуется всего 5 секунд, спасибо. - person John Stephen; 17.02.2014