我写了以下C代码:

_locationsByRegion = new Dictionary<string, IEnumerable<string>>();
foreach (string regionId in regionIds)
{
    IEnumerable<string> locationIds = Locations
        .Where(location => location.regionId.ToUpper() == regionId.ToUpper())
        .Select(location => location.LocationId); //If I cast to an array here, it works.
    _locationsByRegion.Add(regionId, LocationIdsIds);
}

这段代码的目的是创建一个字典,其中“region id”作为键,“location id”的列表作为值。
然而,实际发生的情况是,我得到了一个以“region id”为键的字典,但是每个键的值都是相同的:它是regionid中最后一个区域id的位置列表!
看起来这是lambda表达式求值方式的产物。通过将位置ID列表排到数组中,可以得到正确的结果,但这感觉像是一个笨拙的东西。
处理这种情况的好方法是什么?

最佳答案

你在用林肯。您需要执行一个紧急操作以使其执行.select。tolist()是一个很好的运算符。列表是通用的,它可以直接分配给可枚举的。
在使用linq的情况下,默认情况下它会执行延迟计算。tolist/eager操作强制执行选择。在使用这些运算符之一之前,不会执行该操作。这就像在ado.net中执行sql一样。如果您有一个语句“select*fromsusers”,在您做额外的事情之前,它实际上不会执行查询。tolist使select执行。

08-06 16:12