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