LINQ - выбор второго элемента в IEnumerable - PullRequest
40 голосов
/ 13 сентября 2010

у меня

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

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

Я хочу выбрать среднее значение и придумал это. Это правильный способ выбора второго значения в IEnumberable?

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

Ответы [ 5 ]

75 голосов
/ 13 сентября 2010

Хотя то, что у вас работает, самым простым способом было бы использовать индекс массива и ссылаться на второй элемент (с индексом 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));
30 голосов
/ 13 сентября 2010

Не думаю, что вам нужно .Take(1).

pkgratio.Skip(1).First()
19 голосов
/ 13 сентября 2010

pkgratio.ElementAt(1); для вашего сценария.

Однако ваш метод применим только в том случае, если вы использовали некоторые данные, которые реализовали IQueryable, или вам нужно было взять диапазон элементов, начиная с определенного индекса, например:

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

12 голосов
/ 13 сентября 2010

Ну, Take(1) не является строго необходимым, если вы собираетесь просто First(), поэтому я мог бы пойти с

pkgratio.Skip(1).First();

Однако, First() будет выдавать исключение, если значение отсутствует, поэтому вы можете попробовать FirstOrDefault(), а затем проверить на ноль.

5 голосов
/ 13 сентября 2010

Но в этом случае у вас есть массив, так что вы можете довольно счастливо получить второй элемент, используя:

pkgratio[1]
...