2012-05-11 15 views
0

コレクションの一部を別のコレクションに抽出したい。 私は簡単にforループを使用して同じことができますが、私のlinqクエリは同じもののために動作していません。 testColl1がtestColl2ソース&あるLinqクエリを使用してコレクションを切り捨てる

Collection<string> testColl1 = new Collection<string> {"t1", "t2", "t3", "t4"}; 
Collection<string> testColl2 = new Collection<string>(); 

for (int i = 0; i < newLength; i++) 
{ 
    testColl2.Add(testColl1[i]); 
} 

がある: 私はので、私は、クエリを行う

レガシー道(/初心者チュートリアルのリンク説明と、可能な場合)を補正助けてください、LINQのでは初心者ですcount = newLengthの必要な切り捨てられたコレクション

私は、次のLINQクエリを使用しているが、それらのどれも機能していない...

var result = from t in testColl1 where t.Count() <= newLength select t; 
      var res = testColl1.Where(t => t.Count() <= newLength); 

答えて

3

使用Enumerable.Takeforループでは、testColl1newLength個未満のアイテムがある場合は、IndexOutOfRangeException例外が発生しますが、Takeバージョンでは、この事実を黙って無視し、newLengthアイテムまで返すだけです。

+0

ええ、Uは間違っていますので、私は+1を使っていますので、私の質問を編集しました。 Thx – Biki

+0

@Biki:あなたの修正を反映するために私の答えを編集しました。 – jason

+0

最後に.ToList()または.ToArray()を追加しても、IEnumerableをコレクションに変換する際には役に立ちません。 testColl2 =(Collection )testColl1.Take(newLength);のように使うのは良い習慣ですか? – Biki

2

正しい方法はTakeを使用することです:

var result = testColl1.Take(newLength); 

Whereを使用して同等の方法は次のとおりです。

var result = testColl1.Where((i, item) => i < newLength); 

これらの式は、IEnumerableのように、末尾に.ToList()または.ToArray()を添付することもできます。

どちらの方法でも元の実装よりも少ないアイテムが返されます(具体的にはnewLength == 0が返されない場合など)。

+0

ありがとうございました。あなたがwhere節を説明することができれば素晴らしいことでしょう。 – Biki

1

あなたはこのような何かにforループに変換することができます:あなたのforループとTakeを使用して、バージョン間の意味の違いがあること

var testColl2 = testColl1.Take(newLength).ToList(); 

注:

testColl1.Take(newLength) 
1

使用Take

var result = testColl1.Take(newLength); 

この拡張メソッドは、この場合newLengthで、Nは、あなたが渡すパラメータであるコレクションから最初のN個の要素を返します。

関連する問題