对于每个循环使用LINQ集合意外行为

时间:2014-07-21 18:55:06

标签: c# asp.net linq foreach

我无法理解为什么这个循环正在修改我循环的集合中的对象而不仅仅是循环内的tempProvider对象。

此代码位于另一个遍历县列表的循环中。这个提供商有7个办公室开始,然后当我第一次点击tempProvider.Offices = ...行时,它只在县里有一个匹配的办公室,所以它擦除了其他办公室为countyPcps中的Provider对象,这会影响我必须遍历办公室的其他代码。

谁能告诉我发生了什么以及如何纠正这个问题?

我尝试了一些方法,包括删除OrderBy(x=> x.LastName,使其成为for循环,并删除co​​untyPcps变量的.ToList()。我不知道发生了什么,似乎应该是非常直接的......

var countyPcps =
providersForCounty.Where(x =>
    x.SpecialtiesAndCerts != null && x.SpecialtiesAndCerts.Any() &&
    x.SpecialtiesAndCerts.Contains(specialty)).ToList();

foreach (Provider provider in countyPcps.Where(x => x.LastName != null).OrderBy(x => x.LastName))
{
    Provider tempProvider = provider;
    tempProvider.Offices = tempProvider.Offices.Where(x => x.County == county).ToList();
    xmlSerializer.Serialize(xmlWriter, tempProvider, ns);
}

1 个答案:

答案 0 :(得分:3)

  

我无法理解为什么这个循环正在修改我循环的集合中的对象而不仅仅是循环内部的tempProvider对象。

因为它是同一个对象。将provider指定给tempProvider时,只需复制对象的引用,而不是对象本身; providertempProvider仍然引用Provider类的相同实例。如果Provider是值类型,您将获得该对象的副本,但由于它是引用类型,因此您只需获得该引用的副本。