【问题标题】:What does an Empty IQueryable return as when Empty?Empty IQueryable 在 Empty 时返回什么?
【发布时间】:2011-01-11 20:26:12
【问题描述】:

我需要确定 IQueryable 方法在将其应用于 RadGrid 的数据源时是否返回数据,或者“空”,如下所示:

RadGrid.DataSource = Method(x);

        if (Method(x) == yyy)
        {
            button.Enabled = true;
        }
        else
        {
            button.Enabled = false;
        }

我尝试使用“null”代替“yyy”,但没有成功。单步执行代码时,IQueryable 方法返回为“空”,但我不确定如何使用 If 语句进行验证。

一个 IQueryable 方法返回什么,就好像它返回为空一样,我如何使用 If 语句来验证?

【问题讨论】:

    标签: c# null iqueryable


    【解决方案1】:

    您可以使用 Any() 来检查 IQueryable 中是否有任何元素:

    RadGrid.DataSource = Method(x);
    
    if (Method(x).Any())
    {
        button.Enabled = true;
    }
    else
    {
        button.Enabled = false;
    }
    

    (或者,更短的版本:)

    button.Enabled = Method(x).Any();
    

    【讨论】:

    • 我需要使用 .Any() 吗?因为我在尝试编译时遇到错误。
    • @Lando:通常,如果您已经在使用 IQueryable,它应该“正常工作” - 它是 Queryable.Any (msdn.microsoft.com/en-us/library/bb534338.aspx) 上的扩展方法 - 确保 using System.Linq; 在文件的顶部,以及对 System.Core.dll 的引用。
    • 这也是我的想法。当我在几乎所有当前页面上使用 LINQ 时,System.Linq;页面顶部已存在参考。我正在通过我之前创建的单独 .dll 访问我的方法...应该不会有任何区别?
    • @Lando:不-您看到的确切错误是什么? (编译时还是运行时?消息?)
    • 错误是:错误 95“System.Linq.IQueryable”不包含“Any”的定义,并且没有扩展方法“Any”接受“System.Linq.IQueryable”类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)---没有什么不寻常的,但令人困惑的是为什么它无法识别该引用。
    【解决方案2】:

    你想使用IQueryable.Any

    bool empty = !queryable.Any();
    if(empty) {
        // something
    }
    

    【讨论】:

      【解决方案3】:

      尝试类似的东西

      RadGrid.DataSource = Method(x);            
       if (RadGrid.DataSource as MyObject == null)          
       {              
            button.Enabled = true;          
       }          
       else          
       {              
             button.Enabled = false;          
       }  
      

      【讨论】:

        【解决方案4】:

        试试这个:

        if (Method(x) == Enumerable.Empty<YourType>())
        {
            // Your code
        }
        

        由于Enumerable.Empty&lt;TResult&gt;()TResult 缓存,它将与从Method 重新获得的空序列保持相同的引用,因此将是相等的。

        如果您不确定这是否可行,请运行此示例:

        using System;
        using System.Linq;
        
        class Example
        {
            static void Main()
            {
                var first = Enumerable.Empty<Example>();
                var second = Enumerable.Empty<Example>();
        
                Console.WriteLine(object.ReferenceEquals(first, second));
            }
        }
        

        【讨论】:

        • 我认为这是一个参考比较,因此通常会失败。
        • -1 这将执行参考比较。应该很明显为什么这在几乎所有情况下都不起作用。它在该方法返回Enumerable.Empty&lt;T&gt;() 时起作用——并且在大多数情况下它将返回一些其他没有元素的枚举。
        • 这是我的反例:public static IEnumerable&lt;T&gt; Empty&lt;T&gt;() { yield break; } public static bool Test() { return Empty&lt;object&gt;() == Enumerable.Empty&lt;object&gt;(); }Test() 将返回 false,因为它应该。这仅在被调用的方法返回 Enumerable.Empty&lt;T&gt;() 时才有效——并非所有空枚举都是等价的。使用Enumerable.Any&lt;T&gt;() 是一种更好的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        相关资源
        最近更新 更多