2016-06-15 12 views
1

IEnumerableを実装している.netフレームワークのクラスがICollectionインターフェイスを実装していないかどうかを知りたいと思います。具体的なIEnumerable <T>の実装はICollectionではありません<T>

私は私が書いた次の拡張方法で100%のコードカバレッジを得ることができないので、私はそれを聞いてるのよ。「

public static int GetSafeCount<T>(this IEnumerable<T> nullableCollaction) 
    { 
     if (nullableCollaction == null) 
     { 
      return 0; 
     } 
     var collection = nullableCollaction as ICollection<T>; 
     if (collection != null) 
     { 
      return collection.Count; 
     } 
     return nullableCollaction.Count(); 
    } 

最後の行は、私のテストのいずれにも覆われていないと私ができますそれをカバーするためにインスタンス化する正しいクラスを見つける。

私のテストコードは次のとおりです。

[Test] 
    public void GetSafeCount_NullObject_Return0() 
    { 
     IEnumerable<string> enumerable=null; 

     Assert.AreEqual(0, enumerable.GetSafeCount()); 
    } 
    [Test] 
    public void GetSafeCount_NonICollectionObject_ReturnCount() 
    { 
     IEnumerable<string> enumerable = new string[]{}; 

     Assert.AreEqual(0, enumerable.GetSafeCount()); 
    } 
+0

「Enumerable.Count()」はすでに何をしていますか? –

+1

@PanagiotisKanavos:いいえ、Enumerable.Countの引数がnullの場合、例外がスローされるためです。 –

+0

@ JonSkeetでは、ヌルチェックのみが必要です。残りのコードは削除することができます。ユニットテストでは正しいnull処理を確認するだけで済みます。 –

答えて

1

あなたはStack<T>クラスを使用することができ、それはICollectionIEnumerable<T>ではなくICollection<T>を実装しています。ここで

は、クラスが定義されている方法です。

public class Stack<T> : IEnumerable<T>, IEnumerable, ICollection, 
    IReadOnlyCollection<T> 
+0

でもIEnumerableではない silver

+0

@シルバー、それは 'IEnumerable 'です。私が提供したMSDNドキュメントのリンクを確認することができます。 –

+0

あなたは正しいです!ありがとう! – silver

2

ただ、例えば、任意のLINQの操作を使用しますWhere

public static int GetSafeCount<T>(this IEnumerable<T> nullableCollection) 
    => nullableCollection == null ? 0 : nullableCollection.Count(); 

または::しかし

[Test] 
public void GetSafeCount_NonICollectionObject_ReturnCount() 
{ 
    IEnumerable<string> enumerable = new string[0].Where(x => x.Length == 0); 
    Assert.AreEqual(0, enumerable.GetSafeCount()); 
} 

、あなたはちょうど私が期待Enumerable.Count()に延期して、実装を簡素化することができますが、あなたがそれになりたいすべての方法を最適化することが

public static int GetSafeCount<T>(this IEnumerable<T> nullableCollection) 
    => nullableCollection?.Count() ?? 0; 

(いずれも... C#6を想定)

そのPでointの場合、2つのテストしか持たないことが理にかなっています.1つはヌル引数、もう1つはヌル引数です。

0

彼はICollection<T>ないIEnumerable<T>の例です:

public class MyClass : IEnumerable<int> 
{ 
    public List<int> ints = new List<int> { 1, 2, 3, 4, 5 }; 

    public IEnumerator<int> GetEnumerator() 
    { 
     foreach (var i in ints) 
     { 
      yield return i; 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this as IEnumerator; 
    } 
} 

今、あなたはこれを行うことができます:

foreach(var item in new MyClass()) 
{ 
    // do something 
} 

をしかし、それはICollectionを

ではないのですから、これを行うことはできません
var coll = new MyClass() as ICollection<int>; // null!!! 
関連する問題