web-dev-qa-db-ja.com

LINQ-IEnumerableで2番目の項目を選択

私が持っています

string[] pkgratio= "1:2:6".Split(':');

var items = pkgratio.OrderByDescending(x => x);

中間の値を選択して、これを思いつきました。これはIEnumberableの2番目の値を選択する正しい方法ですか?

pkgratio.Skip(1).Take(1).First();
41
Jon

動作するものの、最も簡単な方法は、配列のインデックスを使用して、2番目の項目を参照することです(最初の要素のインデックスはゼロから始まるため、インデックス1で):_pkgratio[1]_

_Console.WriteLine(pkgratio[1]);
_

より完全な例:

_string[] pkgratio = "1:2:6".Split(':');

for (int i = 0; i < pkgratio.Length; i++)
    Console.WriteLine(pkgratio[i]);
_

_IEnumerable<T>_を使用すると、動作するか、または ElementAtメソッド を使用して要素を直接取得できます。

_// same idea, zero index applies here too
var elem = result.ElementAt(1);
_

以下は_IEnumerable<string>_としてのサンプルです。 AsEnumerable()呼び出しは、_IEnumerable<string>_に対するサンプルの動作を強調することに注意してください。実際には、ElementAtからの_string[]_配列結果に対してSplitを使用できますが、前に示したインデクサーを使用する方が効率的です。

_var pkgratio = "1:2:6".Split(':').AsEnumerable();
Console.WriteLine(pkgratio.ElementAt(1));
_
75
Ahmad Mageed

.Take(1)する必要はないと思います。

pkgratio.Skip(1).First()
31
Cheng Chen

シナリオのpkgratio.ElementAt(1);

ただし、メソッドはIQueryableを実装したデータを使用していた場合、または特定のインデックスで始まるアイテムの範囲を取得する必要がある場合にのみ適用できます。例:

pkgratio.Skip(5).Take(10);

19
BeRecursive

Take(1)は、First()だけを使用する場合は厳密には必要ないので、

_pkgratio.Skip(1).First();
_

ただし、そのFirst()は値がない場合は例外をスローするため、FirstOrDefault()を試してからnullをチェックすることをお勧めします。

12
Jason Punyon

ただし、この場合は配列があるため、次の項目を使用して2番目の項目を非常に喜んで取得できます。

pkgratio[1]
5
Andrew Barrett