通过Outlook.Items缓慢迭代以查找联系人

时间:2015-03-11 17:36:40

标签: c# outlook office-interop

我遇到了一个问题,我试图在任何outlook文件夹中找到至少一个联系人。我有一个递归函数,它通过文件夹中的项目进行迭代,如果该项目是联系人类型,那么我们将它添加到列表中。但是,当文件夹有大量记录说4000项时,此代码运行速度极慢。

有没有办法只是为了获得联系,还是有办法让这些代码更有效率?

foreach (var item in folderBase.Items)
{
    if (returnFirst && result.Count > 0)
        break;

    if ((item is Outlook.ContactItem))
    {
        result.Add((Outlook.ContactItem)item);
    }
}

2 个答案:

答案 0 :(得分:1)

首先,在列表中存储4000个实时Outlook对象是一个坏主意:如果在项目255处进行在线Exchange存储,则将耗尽RPC通道。存储条目ID并使用它们来调用Namespace.GetItemFromID()时你真的需要它;然后在你完成后立即释放它。

其次,使用MAPIFolder.GetTable - 它可以让您从多个项目中检索值而无需实际打开它们;在你的情况下完美。尝试类似下面的内容(VB脚本):

set Folder = Application.ActiveExplorer.CurrentFolder
set Table = Folder.GetTable("[MessageClass] = 'IPM.Contact' ")
Table.Columns.Add("EntryID")
while not Table.EndOfTable
  set Row = Table.GetNextRow()
  vEntryId = Row.Item(1)
  Debug.Print vEntryId
wend

答案 1 :(得分:0)

您需要使用Items类的Find / FindNextRestrict方法。

阅读有关这些方法的更多信息,并参阅以下文章中的示例代码:

您可以使用Outlook项目的MessageClass属性来获取联系人项目。