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<T>
,您可以使用,或者您可以使用ElementAt
method 直接获取元素:
// same idea, zero index applies here too
var elem = result.ElementAt(1);
这是您的示例IEnumerable<string>
。请注意,AsEnumerable()
调用是为了强调该示例对IEnumerable<string>
的作用。实际上,您可以对来自Split
的string[]
数组结果使用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>