2012-01-25 4 views
8

方法では、私はobjectを得る。IList <>の項目数を取得する方法はオブジェクトとして得られますか?

場合によっては、objectIListの「something」(これは何かを制御できません)です。

私がしようとしています:

  1. このオブジェクトが(何かの)IListであることを識別
  2. はそれからCountを得ることができるように、「IList<something>」にobjectをキャストします。今の

、私は立ち往生し、アイデアを探しています。

+0

*あなたが望むすべての 'Count' *ですか?もしそうなら、それを 'IList 'にする必要はありません。単純な 'IEnumerable'がこれを行います。 – AakashM

+0

はい、「カウント」はすべて私が望むものです。しかし、私は 'Count'を' IEnumerable'で見ることができません。 – remio

答えて

17

objectIListを実装しているかどうかを確認するには、isを使用してください。

次に、あなたは、カウントを得るためにあなたのobjectIListにキャストすることができます。

object myObject = new List<string>(); 

// check if myObject implements IList 
if (myObject is IList) 
{ 
    int listCount = ((IList)myObject).Count; 
} 
+0

ああ、これは私が逃したものです。私は 'IList 'である' IList 'を探していました。しかし、 'List 'と 'Collection 'は 'IList'sなので、これで十分です。ありがとう。 – remio

4
if (obj is ICollection) 
{ 
    var count = ((ICollection)obj).Count; 
} 
+0

あなたの答えをありがとう。 IListにキャスティングすると、ICollectionにキャストするメリットはありますか? – remio

+1

もっと多くのタイプのコレクションで動作し、IEnumerableにキャストし、.Countの代わりに.Count()を読むと、さらに多くのもので動作します。 –

+1

@DannyVarodしかし 'IEnumerable.Count()'は、アイテムを数えるためにコレクションを列挙する危険があります。 – phoog

1
 object o = new int[] { 1, 2, 3 }; 

     //... 

     if (o is IList) 
     { 
      IList l = o as IList; 
      Console.WriteLine(l.Count); 
     } 

intは、[]のIListであるので、これは、3を出力します。

0

あなたが望むのはカウントだけなので、IList<T>を実装するものもIEnumerableを実装するという事実を使うことができます。さらに任意の(一般的な)シーケンスの数を返しますSystem.Linq.Enumerableで拡張メソッドがあります:

var ienumerable = inputObject as IEnumerable; 
if (ienumerable != null) 
{ 
    var count = ienumerable.Cast<object>().Count(); 
} 

Castへの呼び出しがあるため箱there isn't a Count on non-generic IEnumerable外です。

+0

ああ、はい、私はそれを手に入れます!しかし、私はこの実装でパフォーマンスの影響を期待する必要がありますか? – remio

+0

@remioはい、そうです。 'Cast 'を呼び出すので、基になるリストの 'Count'プロパティの恩恵を受けることはできません。したがって、アイテムを数えるためにリスト全体を繰り返し処理します。さらに、リストの要素が値型の場合は、 'object'へのキャストのためにリストの各要素を囲む必要があります。 – phoog

関連する問題