c# - 在 IEnumerable<T> 中选择偶数/奇数元素?

标签 c# linq .net-4.0 ienumerable

<分区>

Possible Duplicate:
Getting odd/even part of a sequence with LINQ
How can I get every nth item from a List<T>?

我正在使用 HtmlAgilityPack 和 C# 来解析一些 HTML。

<div id="post-8266">
<div class="ruler"> </div>
<div id="post-8266">
<div class="ruler"> </div>
<div id="post-8266">
<div class="ruler"> </div>
<div id="post-8266">
<div class="ruler"> </div>

基本上,我有这些元素,每个元素都在它们自己的对象中,在 IEnumerable 中。

有没有一种优雅的方法来获取集合中的每个 N/2 元素。意思是,跳过每个带有 .ruler 类的 div?

我需要遍历结果集,所以我要么将每个找到的对象复制到一个新的 IEnumerable 中,要么只在 foreach 函数中内联使用它。

例如:

//Copying resulting set to new IEnumerable<T>:
var odds = elements.SelectOdds();

//Using it inline for my usage:
foreach (var x in elements.SelectOdds())
{   
}

哪些选项最好,我怎样才能优雅地实现这一目标?

最佳答案

var odds = sequence.Where((item, index) => index % 2 != 0);
var evens = sequence.Where((item, index) => index % 2 == 0);

我唯一不喜欢这个解决方案的地方是,如果您同时需要赔率和偶数,它需要将序列迭代两次。如果出于某种原因你必须避免这种情况,你将不得不更加努力地工作:

var groups = sequence.Select((item, index) => new { Item = item, Index = index })
                     .GroupBy(x => x.Index % 2 == 0)
                     .ToDictionary(g => g.Key, g => g);

然后,赔率是 groupsKeyfalse 的元素,偶数是 groups 中的那些元素 其中 Keytrue:

var odds = groups[false];
var evens = groups[true];

关于c# - 在 IEnumerable<T> 中选择偶数/奇数元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269847/

相关文章:

c# - 检查具有特定值的 XElement 是否存在

c# - 有条件的

VB.NET 多线程。从单独的类文件中的类调用 UI 控件的 invoke

c# - 无法加载文件或程序集 SMDiagnostics.dll

c# - 将 int 字符串转换为十六进制字符串

C# json反序列化对象

c# - Windows Phone 7 中的媒体播放器

c# - 在对象数组中查找

c# - 每次运行应用程序时生成相同数字的随机数生成器

.net - 在多个程序集中定义的 System.Tuple