我遇到了一个问题,我试图在任何outlook文件夹中找到至少一个联系人。我有一个递归函数,它通过文件夹中的项目进行迭代,如果该项目是联系人类型,那么我们将它添加到列表中。但是,当文件夹有大量记录说4000项时,此代码运行速度极慢。
有没有办法只是为了获得联系,还是有办法让这些代码更有效率?
foreach (var item in folderBase.Items)
{
if (returnFirst && result.Count > 0)
break;
if ((item is Outlook.ContactItem))
{
result.Add((Outlook.ContactItem)item);
}
}
答案 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 / FindNext或Restrict方法。
阅读有关这些方法的更多信息,并参阅以下文章中的示例代码:
您可以使用Outlook项目的MessageClass属性来获取联系人项目。