为什么Linq.Enumerable.Count()抛出`InvalidOperationException`

时间:2016-03-05 07:11:18

标签: c# .net linq

为什么它不理解这个区域发生了异常。 我测试过了。但是,它不会发生。

如果修改如下:它会解决吗?

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;
}

3 个答案:

答案 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()