weixin_33739646 2015-12-10 00:45 采纳率: 0%
浏览 46

对于循环运行缓慢

I have a Web Method that is querying Outlook to grab all the distribution lists from the Global Address List.

This is grabbing over 4,000 distribution lists, which is exactly what I want it to do, but when it goes into the loop to pass the 4,000 lists into my List it takes over 3 minutes for it to finish the for loop. Can anyone see anything that is out of the ordinary and have an answer of why this may be happening?

Here is my code:

        public class DistributionListDetails
        {
            public int DistributionListId { get; set; }
            public string DistributionListEmail { get; set; }
        }

        List<DistributionListDetails> distributionLists = new List<DistributionListDetails>();
        int val = 0;

        //create Outlook application. 
        Outlook.Application oApp = new Outlook.Application();

        //get Mapi NameSpace and Logon. 
        Outlook.NameSpace oNS = oApp.GetNamespace("mapi");

        //get Global Address List. 
        Outlook.AddressLists oDLs = oNS.AddressLists;
        Outlook.AddressList oGal = oDLs["Global Address List"];

        //get a specific distribution list. 
        string sDL = "TestDL";
        Outlook.AddressEntries oEntries = oGal.AddressEntries;
        Outlook.AddressEntry oDL = oEntries[sDL];

        if (oDL.Manager != null)
        distributionLists.Add(new DistributionListDetails
            {
                DistributionListId = val,
                DistributionListEmail = oDL.Manager.ToString()
            });

        //get all of the members of the distribution list. 
        oEntries = oDL.Members;
        Outlook.AddressEntry oEntry = default(Outlook.AddressEntry);

        int i = 0;
        for (i = 1; i <= oGal.AddressEntries.Count && i <= 10; i++)
        {
            oEntry = oGal.AddressEntries[i];
            distributionLists.Add(new DistributionListDetails
            {
                DistributionListId = val,
                DistributionListEmail = oEntry.Name
            });
        }

NOTE: I am binding the returned list from the loop to a dropdown via AJAX.

  • 写回答

3条回答 默认 最新

  • weixin_33725272 2015-12-10 00:49
    关注

    Assuming that the query to AD isn't the bottleneck, try this LINQ on for size. It replaces your last loop.

    distributionLists.AddRange(oGal.AddressEntries
      .Cast<Outlook.AddressEntry>()
      .Select(
        x => new DistributionListDetails 
        { 
            DistributionListId = val, 
            DiestributionListEmail = x.Name
        }));
    

    Edit: Force cast the AddressEntries into an IQueryable so select will work.

    评论

报告相同问题?