LINQ - 在IEnumerable中选择第二项

Jon*_*Jon 44 c# linq .net-3.5 c#-3.0

我有

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

var items = pkgratio.OrderByDescending(x => x);
Run Code Online (Sandbox Code Playgroud)

我想选择中间值并提出这个问题.这是在IEnumberable中选择第二个值的正确方法吗?

pkgratio.Skip(1).Take(1).First();
Run Code Online (Sandbox Code Playgroud)

Ahm*_*eed 78

虽然你有什么工作,最直接的方法是使用数组的索引并引用第二个项目(索引1,因为索引从第一个元素的零开始): pkgratio[1]

Console.WriteLine(pkgratio[1]);
Run Code Online (Sandbox Code Playgroud)

一个更完整的例子:

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

for (int i = 0; i < pkgratio.Length; i++)
    Console.WriteLine(pkgratio[i]);
Run Code Online (Sandbox Code Playgroud)

使用IEnumerable<T>您的工作,或者您可以使用该ElementAt方法直接获取元素:

// same idea, zero index applies here too
var elem = result.ElementAt(1);
Run Code Online (Sandbox Code Playgroud)

这是你的样本IEnumerable<string>.请注意,AsEnumerable()调用是为了强调示例对抗一个IEnumerable<string>.实际上,你可以使用ElementAtstring[]从阵列的结果Split,但它更有效地使用前面介绍的索引.

var pkgratio = "1:2:6".Split(':').AsEnumerable();
Console.WriteLine(pkgratio.ElementAt(1));
Run Code Online (Sandbox Code Playgroud)

  • 同样在这里为ElementAt +1,现在也使用ElementAtOrDefault (4认同)

Che*_*hen 33

我觉得你不需要.Take(1).

pkgratio.Skip(1).First()
Run Code Online (Sandbox Code Playgroud)


BeR*_*ive 19

pkgratio.ElementAt(1); 为您的方案.

但是,只有在使用某些已实现的数据IQueryable或需要从特定索引处开始处理一系列项目时,您的方法才适用,例如:

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


Jas*_*yon 13

嗯,Take(1)如果你想要的话,这不是绝对必要的First(),所以我可能会去

pkgratio.Skip(1).First();
Run Code Online (Sandbox Code Playgroud)

但是,First()如果没有值,则会抛出异常,因此您可能需要尝试FirstOrDefault()然后检查null.


And*_*ett 5

但是在这种情况下你有一个数组,所以你可以很高兴得到第二个项目使用:

pkgratio[1]
Run Code Online (Sandbox Code Playgroud)