2011-01-11 19 views
5

私はそうのようなRadGridのデータソースにそれを適用する際のIQueryableメソッドは、データを返す、または「空」かどうかを決定する必要がでています:空のIQueryableは、空の場合と同じように何を返しますか?

RadGrid.DataSource = Method(x); 

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

私の代わりに「ヌル」を使用して試してみました"yyy"しかし成功なし。コードをステップ実行すると、IQueryableメソッドは "Empty"として返されますが、Ifステートメントを使用して検証する方法は不明です。

IQueryableメソッドはEmptyとして返される場合と、If文を使用してそれを確認するにはどうすればよいですか?

答えて

12

あなたは使用することができ、任意の()のIQueryableのいずれかの要素があるかどうかを確認するには:

RadGrid.DataSource = Method(x); 

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

(あるいは、短いバージョン:)

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

.Any()を使用する必要がある余分な参照はありますか?これをコンパイルしようとするとエラーが発生します。 – Lando

+1

@Lando:通常、IQueryableを使用している場合は、「正常に動作する」必要があります.Quickable.Anyの拡張メソッドです(http://msdn.microsoft.com/en-us/library/bb534338.aspx) - ファイルの先頭に 'using System.Linq;'とSystem.Core.dllへの参照があることを確認してください。 –

+0

これも私が考えていたものです。現在のほとんどのページでLINQを使用しているので、System.Linq;参照は既にページの上部にあります。私は以前作成した別の.dllを使ってメソッドにアクセスしていますが、違いはありませんか? – Lando

-2

この試し:Enumerable.Empty<TResult>()ため

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

は、それがMethodからreterned空の配列と同一の参照を保持し、したがってequatableなりTResultためにキャッシュされています。

あなたはこれが動作するかどうかわからない場合は、この例を実行してください:

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)); 
    } 
} 
+0

私はそれが参考と思います比較は失敗します。 – jason

+0

-1これは参照の比較を実行します。これがほとんどすべての場合にうまくいかない理由は明らかです。このメソッドが 'Enumerable.Empty ()'を返す場合にのみ*働きます。ほとんどの場合、要素を持たない他のいくつかの列挙型が返されます。 – cdhowie

+0

これは私の反例です: 'public static IEnumerable (){yield break; } public static bool Test(){空の戻り値()== Enumerable.Empty (); } '。 'Test()'はfalseを返します。これは、呼び出されたメソッドが 'Enumerable.Empty ()'を返す場合にのみ機能します。すべての空の列挙子は同等ではありません。 'Enumerable.Any ()'を使う方がずっと良い方法です。 – cdhowie

5

あなたがIQueryable.Anyを使用します。

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

試してみてください

RadGrid.DataSource = Method(x);    
if (RadGrid.DataSource as MyObject == null)   
{    
     button.Enabled = true;   
}   
else   
{    
     button.Enabled = false;   
} 
関連する問題