Outlook Interop删除约会Patern的约会

时间:2017-12-01 13:52:42

标签: c# outlook interop

因此,基本上,我尝试做的是删除Outlook中符合特定模式的所有约会(它是一个简单的约会,因此不需要Regex )。

因此,我使用以下代码使用互操作来检索日历中的每个项目。

Outlook.Application outlook = new Outlook.Application();
Outlook.NameSpace mapiNameSpace = outlook.GetNamespace("MAPI");
Outlook.MAPIFolder calendarFolder = mapiNameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;

然后使用以下代码迭代并删除它们:

foreach (Outlook.AppointmentItem appointment in outlookCalendarItems)
{
     if (appointment.Subject.Contains("On Call: Regions:"))
     {
          appointment.Delete();
     }
}

然而,出于某种原因,某些项目似乎被删除了,其中一些项目因为没有明显的模式而被遗漏。每个约会的Subject以相同的方式为每个约会生成(在应用程序的不同部分):

appt.Subject = $"On Call: {appointment.Region}";

使用以下内容生成appointment.Region

Region = $"Regions: {regions.Aggregate((x, y) => x + " & " + y)}"

结果是:

  

通话:地区:6& 7

     

通话:地区:NS

     

等...

因此,如果它为某些人工作,它应该适用于所有人。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果从items集合中删除,则必须使用索引器从头到尾删除。这意味着如果删除项目,它将从项目集合中删除并发送到已删除的文件夹。

例如,在MSDN

中记录了这一点

如果你不这样做,但是从头开始迭代,项目将被删除,之后的项目将替换它。所以很可能你正在跳过一个条目。如果以下项目也符合您的过滤器,则不会将其删除。这就解释了为什么你在第二次运行中找到它 这不是.net集合。您正在使用互操作包装器。它的行为可能与您在c#中的预期不同。

例如试试这个。根据文档,索引是基于1的。不是基于0 - 但更好地仔细检查自己,因为我现在无法自己测试:

for (int i = outlookCalenderItems.Count; i > 0; i--)
{
     if (outlookCalenderItems[i].Subject.Contains("On Call: Regions:"))
     {
          outlookCalenderItems[i].Delete();
     }
}