LINQ - 选择 IEnumerable 中的第二项

69

我有

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

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

我想选择中间的值,并想到了这种方法。这是在 IEnumberable 中选择第二个值的正确方式吗?

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

与我第一个问题相关的内容:https://dev59.com/VnI-5IYBdhLWcg3wq6Zo - Matt Ellen
1
使用 First() 意味着您有信心在尝试访问的位置上实际上会有一个项目。如果存在任何疑虑,您可能希望使用 FirstOrDefault() - Anthony Pegram
4个回答

101

虽然您的代码能够正常运行,但更为简单的方法是使用数组的索引,并引用第二个元素(因为索引从零开始,第一个元素的索引为0):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>。实际上,您可以对来自 Splitstring[] 数组结果使用 ElementAt,但使用之前显示的索引器更有效率。

var pkgratio = "1:2:6".Split(':').AsEnumerable();
Console.WriteLine(pkgratio.ElementAt(1));

1
多年来一直在使用Linq,但从未使用过ElementAt()。现在正忙着编写一些测试并需要它。得到了一个简单而好的答案。 - Peter Munnings
8
我也一样,支持使用 ElementAt 方法,现在还开始使用 ElementAtOrDefault 方法。 - jolySoft

53

我认为你不需要使用.Take(1)

pkgratio.Skip(1).First()

23

对于你的情况,可以使用 pkgratio.ElementAt(1); 方法。

但是,你的方法仅适用于使用了实现了 IQueryable 接口的数据或者需要从特定索引开始取一定范围内的项的情况。比如:

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


19

好的,如果你只是要使用 First(),那么 Take(1)并不是必需的,所以我可能会使用

pkgratio.Skip(1).First();

但是,如果没有值,那么First()将抛出一个异常,因此您可能希望尝试使用FirstOrDefault(),然后检查是否为null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接