LINQ - 在 IEnumerable 中选择第二个项目

Posted

技术标签:

【中文标题】LINQ - 在 IEnumerable 中选择第二个项目【英文标题】:LINQ - selecting second item in IEnumerable 【发布时间】:2011-04-11 16:43:16 【问题描述】:

我有

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

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

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

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

【问题讨论】:

与我的第一个问题有关:***.com/questions/1735146/… 使用First() 表示您确信某个项目实际上会位于您尝试访问的位置。如有疑问,不妨使用FirstOrDefault() 【参考方案1】:

虽然您的工作有效,但最直接的方法是使用数组的索引并引用第二项(在索引 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&lt;T&gt;,您可以使用,或者您可以使用ElementAt method 直接获取元素:

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

这是您的示例IEnumerable&lt;string&gt;。请注意,AsEnumerable() 调用是为了强调该示例对IEnumerable&lt;string&gt; 的作用。实际上,您可以对来自Splitstring[] 数组结果使用ElementAt,但使用前面显示的索引器更有效。

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

【讨论】:

与 Linq 合作多年,从未使用过 ElementAt()。忙着写一些测试,需要它。很好的简单答案 这里同样为 ElementAt +1,现在也使用 ElementAtOrDefault【参考方案2】:

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

pkgratio.Skip(1).First()

【讨论】:

【参考方案3】:

pkgratio.ElementAt(1); 用于您的场景。

但是,您的方法仅适用于您使用一些实现 IQueryable 的数据,或者您需要从特定索引开始获取一系列项目,例如:

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

【讨论】:

【参考方案4】:

好吧,如果您只想使用First()Take(1) 并不是绝对必要的,所以我可能会选择

pkgratio.Skip(1).First();

但是,如果没有值,First() 将抛出异常,因此您可能想尝试FirstOrDefault(),然后检查是否为 null。

【讨论】:

以上是关于LINQ - 在 IEnumerable 中选择第二个项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 选择类的属性以返回 IEnumerable<T>

译使用 LINQ 合并 IEnumerable 序列

LINQ 的具体程度如何。包含 IEnumerable 结果?

如何在 LINQ 选择语句中使用 Lambda

使用 LINQ 选择 Dictionary<T1, T2>

如何使用 LINQ 修改 IEnumerable 以避免 foreach 循环? [复制]