C# 比较两个列表时索引超出范围

C# 比较两个列表时索引超出范围,c#,outlook-addin,outlook-2010,C#,Outlook Addin,Outlook 2010,我在互联网上到处寻找答案。我使用嵌套for循环遍历两个列表(list1和list2),并根据三个条件删除第一个列表中的重复记录。如果这两个列表中的所有记录都相互匹配,则会出现越界错误。我假设当我从第一个列表中删除所有项目时,当它最终减少到0,并且没有任何可循环的记录时,会发生这种情况,但是使用if语句检查第一个列表的计数(如果收件箱\电子邮件\过滤\联系人。计数>0)也没有帮助。请让我知道,如果你们中的任何人可以告诉我为什么会出现这种错误 C#.net中的Outlook加载项 for(int i

我在互联网上到处寻找答案。我使用嵌套for循环遍历两个列表(list1和list2),并根据三个条件删除第一个列表中的重复记录。如果这两个列表中的所有记录都相互匹配,则会出现越界错误。我假设当我从第一个列表中删除所有项目时,当它最终减少到0,并且没有任何可循环的记录时,会发生这种情况,但是使用if语句检查第一个列表的计数(如果收件箱\电子邮件\过滤\联系人。计数>0)也没有帮助。请让我知道,如果你们中的任何人可以告诉我为什么会出现这种错误

C#.net中的Outlook加载项
for(int i=0;i0)
{
if((list1[i].username==注册用户)
&&(列表1[i]。from_email.ToLower()==list2[j]。from_email.ToLower())
&&(列表1[i]。电子邮件主题==列表2[j]。电子邮件主题)
&&(list1[i]。电子邮件\u时间戳。ToLongDateString()==list2[j]。电子邮件\u时间戳。ToLongDateString())
{
//从收件箱\u电子邮件\u筛选的\u联系人中删除重复的电子邮件
清单1.删除(i);
}
}
}
}

在从列表/数组中删除项的同时迭代列表/数组时,请使用反向符号(Visual Studio中的代码段“forr”):


很可能在应用程序电子邮件中存在多个重复项,因此removeAt(i)被多次调用。如果i是列表中长度超过2的最后一项,而您最终删除了多次,则您的if将永远不会发现这种情况

此外,您还将跳过带有remove语句的电子邮件。假设i=4,如果在4处删除,则索引4将包含一个新项,在下一次迭代中,i将为5。你可能会有一个更好的循环

int i=0;
while (i < inbox_emails.Count) {
   bool foundDuplicate=false;
   for (int j=0;j<for (int j = 0; j < application_emails.Count; j++) {       
     if ((inbox_emails[i].username == registered_user)       
         && (inbox_emails[i].from_email.ToLower() == application_emails[j].from_email.ToLower())       
         && (inbox_emails[i].email_subject == application_emails[j].email_subject)       
         && (inbox_emails[i].email_timestamp.ToLongDateString() == application[j].email_timestamp.ToLongDateString()))       
        {       
           foundDuplicate=true;
           break;   // This is optional but it stops the j loop from continuing as we've found a duplicate
        }       
    }   
    if (foundDuplicate) {
       inbox_emails.RemoveAt(i);
    } else {
       i++;
    }
}

我建议在这里使用
循环。此外,如果发现匹配项,则需要中断内部循环,以便从头开始检查

int i = 0;
while (i < list1.Count)
{
    int found = 0;
    for (int j = 0; j < list2.Count; j++)
    {
        if ((list1[i].username == registered_user)
            && (list1[i].from_email.ToLower() == list2[j].from_email.ToLower())
            && (list1[i].email_subject == list2[j].email_subject)
            && (list1[i].email_timestamp.ToLongDateString() == list2[j].email_timestamp.ToLongDateString()))
        {
            //Remove the duplicate email from inbox_emails_filtered_contacts
            list1.RemoveAt(i);
            found = 1;
            break;
        }
   }
   if (!found)
   {
       i++;
   }
}
inti=0;
而(i
下面是电子邮件类的一个实现

class Email:IComparable<Email>
{
    private static int _Id;

    public Email()
    {
        Id = _Id++;
    }

    public int Id { get; private set; }
    public string UserName { get; set; }
    public string Body { get; set; }
    public string Subject { get; set; }
    public DateTime TimeStamp { get; set; }

    public override int GetHashCode()
    {
        return UserName.GetHashCode() ^ Body.GetHashCode() ^ Subject.GetHashCode();
    }

    public int CompareTo(Email other)
    {
        return GetHashCode().CompareTo(other.GetHashCode());
    }

    public override string ToString()
    {
        return String.Format("ID:{0} - {1}", Id, Subject);
    }

    public override bool Equals(object obj)
    {
        if (obj is Email)
            return CompareTo(obj as Email) == 0;
        return false;
    }

}
class电子邮件:IComparable
{
私有静态int_Id;
公共电子邮件()
{
Id=_Id++;
}
public int Id{get;private set;}
公共字符串用户名{get;set;}
公共字符串体{get;set;}
公共字符串主题{get;set;}
公共日期时间时间戳{get;set;}
公共覆盖int GetHashCode()
{
返回用户名。GetHashCode()^Body.GetHashCode()^Subject.GetHashCode();
}
公共int比较(电子邮件其他)
{
返回GetHashCode().CompareTo(other.GetHashCode());
}
公共重写字符串ToString()
{
返回String.Format(“ID:{0}-{1}”,ID,Subject);
}
公共覆盖布尔等于(对象对象对象)
{
如果(obj是电子邮件)
返回CompareTo(obj作为电子邮件)==0;
返回false;
}
}
和两种获得差异的方法

        var list1 = new List<Email>();
        var ran = new Random();
        for (int i = 0; i < 50; i++)
        {
            list1.Add(new Email() { Body = "Body " + i, Subject = "Subject " + i, UserName = "username " + i, TimeStamp = DateTime.UtcNow.AddMinutes(ran.Next(-360, 60)) });
        }
        var list2 =  new List<Email>();

        for (int i = 0; i < 50; i++)
        {
            if (i % 2 == 0)
                list2.Add(new Email() { Body = "Body " + i, Subject = "Subject Modifed" + i, UserName = "username " + i, TimeStamp = DateTime.UtcNow.AddMinutes(ran.Next(-360, 60)) });
            else 
                list2.Add(new Email() { Body = "Body " + i, Subject = "Subject " + i, UserName = "username " + i, TimeStamp = DateTime.UtcNow.AddMinutes(ran.Next(-360, 60)) });

        }


        foreach (var item in list2.Intersect<Email>(list1))
        {
            Console.WriteLine(item);
        }

        foreach (var item in list1)
        {
            for (int i = 0; i < list2.Count; i++)
            {

                if (list2[i].Equals(item))
                {
                    Console.WriteLine(item);
                    list2.RemoveAt(i);
                    break;
                }
            }
        }

        Console.WriteLine(list2.Count);
var list1=新列表();
var ran=new Random();
对于(int i=0;i<50;i++)
{
列表1.Add(newemail(){Body=“Body”+i,Subject=“Subject”+i,UserName=“UserName”+i,TimeStamp=DateTime.UtcNow.AddMinutes(ran.Next(-360,60)));
}
var list2=新列表();
对于(int i=0;i<50;i++)
{
如果(i%2==0)
列表2.Add(新电子邮件(){Body=“Body”+i,Subject=“Subject modified”+i,UserName=“UserName”+i,TimeStamp=DateTime.UtcNow.AddMinutes(ran.Next(-360,60)));
其他的
列表2.Add(newemail(){Body=“Body”+i,Subject=“Subject”+i,UserName=“UserName”+i,TimeStamp=DateTime.UtcNow.AddMinutes(ran.Next(-360,60)));
}
foreach(列表2.Intersect(列表1)中的var项)
{
控制台写入线(项目);
}
foreach(列表1中的变量项)
{
for(int i=0;i
看起来您在两个数组之间循环,不知道您可以这样索引列表吗?每次删除项目时,您可能只想减小索引。当您删除索引i处的项目时,位于i+1位置的项目将取而代之。因此,在下一个循环中,处理i+2项,而忽略i+1项(现在位于i位置…)。与的相反不会导致此问题。list1和list2中包含的元素类型是什么?我假设这些列表是通用列表
List
,实际类型
T
的名称是什么?是的,Ivan,你是对的,它是“email”类型的通用列表,是一个用户定义的类。电子邮件类具有以下属性-公共字符串用户名;电子邮件中的公共字符串;_name中的公共字符串;公共字符串电子邮件主题;公共字符串电子邮件正文;公共日期时间电子邮件\u时间戳;当代码执行时,是否可以在另一个线程中修改列表?好的,那么还有其他问题,但是您仍然应该使用此模式,否则您将进入
int i = 0;
while (i < list1.Count)
{
    int found = 0;
    for (int j = 0; j < list2.Count; j++)
    {
        if ((list1[i].username == registered_user)
            && (list1[i].from_email.ToLower() == list2[j].from_email.ToLower())
            && (list1[i].email_subject == list2[j].email_subject)
            && (list1[i].email_timestamp.ToLongDateString() == list2[j].email_timestamp.ToLongDateString()))
        {
            //Remove the duplicate email from inbox_emails_filtered_contacts
            list1.RemoveAt(i);
            found = 1;
            break;
        }
   }
   if (!found)
   {
       i++;
   }
}
class Email:IComparable<Email>
{
    private static int _Id;

    public Email()
    {
        Id = _Id++;
    }

    public int Id { get; private set; }
    public string UserName { get; set; }
    public string Body { get; set; }
    public string Subject { get; set; }
    public DateTime TimeStamp { get; set; }

    public override int GetHashCode()
    {
        return UserName.GetHashCode() ^ Body.GetHashCode() ^ Subject.GetHashCode();
    }

    public int CompareTo(Email other)
    {
        return GetHashCode().CompareTo(other.GetHashCode());
    }

    public override string ToString()
    {
        return String.Format("ID:{0} - {1}", Id, Subject);
    }

    public override bool Equals(object obj)
    {
        if (obj is Email)
            return CompareTo(obj as Email) == 0;
        return false;
    }

}
        var list1 = new List<Email>();
        var ran = new Random();
        for (int i = 0; i < 50; i++)
        {
            list1.Add(new Email() { Body = "Body " + i, Subject = "Subject " + i, UserName = "username " + i, TimeStamp = DateTime.UtcNow.AddMinutes(ran.Next(-360, 60)) });
        }
        var list2 =  new List<Email>();

        for (int i = 0; i < 50; i++)
        {
            if (i % 2 == 0)
                list2.Add(new Email() { Body = "Body " + i, Subject = "Subject Modifed" + i, UserName = "username " + i, TimeStamp = DateTime.UtcNow.AddMinutes(ran.Next(-360, 60)) });
            else 
                list2.Add(new Email() { Body = "Body " + i, Subject = "Subject " + i, UserName = "username " + i, TimeStamp = DateTime.UtcNow.AddMinutes(ran.Next(-360, 60)) });

        }


        foreach (var item in list2.Intersect<Email>(list1))
        {
            Console.WriteLine(item);
        }

        foreach (var item in list1)
        {
            for (int i = 0; i < list2.Count; i++)
            {

                if (list2[i].Equals(item))
                {
                    Console.WriteLine(item);
                    list2.RemoveAt(i);
                    break;
                }
            }
        }

        Console.WriteLine(list2.Count);