为什么它不理解这个区域发生了异常。 我测试过了。但是,它不会发生。
如果修改如下:它会解决吗?
if (items != null && items.Count() > 0) >>> if(items.Any())
异常消息:
System.InvalidOperationException:修改了集合;枚举操作可能无法执行 在System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource资源)
在System.Collections.Generic.List`1.Enumerator.MoveNextRare()
在System.Collections.Generic.List`1.Enumerator.MoveNext()
在System.Linq.Enumerable.WhereListIterator`1.MoveNext()
在System.Linq.Buffer`1..ctor(IEnumerable`1 source)
在System.Linq.OrderedEnumerable`1.d__0.MoveNext()
在System.Linq.Enumerable.Count [TSource](IEnumerable`1 source)
例外代码:
var items = this._dataManager.LotList
.Where(lot => lot.LOT_ID == (string)cpVals[6] && lot.ADDRESS.ToString() == (string)cpVals[3])
.OrderByDescending(lot => lot.CREATE_TIME);
if (items != null && items.Count() > 0)
{
测试代码:
List<User> Users = new List<User>();
Users.Add(new User());
Users[0].Name = "Kim";
Users[0].Age = 1;
Users.Add(new User());
Users[1].Name = "Kim";
Users[1].Age = 2;
var items = Users.Where(u => u.Name == "Kim").OrderByDescending(u => u.Age);
Users.Clear();
if (items != null && items.Count()>0)
{
User a = items.ElementAt(0);
}
public class User
{
public User()
{
}
public string Name;
public int Age;
}
答案 0 :(得分:2)
您还没有向我们展示正确的代码。问题出现了,因为代码中的某个位置在您迭代它时正在修改集合。您所显示的代码都没有这样做,因此我们无法说明发生了什么。
我唯一提到的另一件事就是你的测试代码。你写了这个:
var items = Users.Where(u => u.Name == "Kim").OrderByDescending(u => u.Age);
Users.Clear();
if (items != null && items.Count()>0)
{
User a = items.ElementAt(0);
}
很明显,items != null
始终为true
。你肯定已经分配了它。但是,由于您在尝试评估项目之前发出了Users.Clear()
来电,因此items.Count()
将始终等于零。 LINQ使用延迟执行,因此只在您使用它时评估查询。
答案 1 :(得分:0)
你应该使用items.Any()而不是items.Count(),如果你只想知道项目中是否有任何东西,但你仍然必须首先检查null。
所以:
if(items != null && items.Any()){ /* hooray goes here */}
Any()比Count()更快,因为它在检查一个项目的存在后停止。
答案 2 :(得分:0)
你必须只写一个toList,这可以为你做一个技巧 enumerable.toList()。COUNT()