15

可能重复:
使用 LINQ 获取序列的奇数/偶数部分
如何从 List<T> 中获取每第 n 个项目?

我正在使用 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 元素。意思是,用 class 跳过每个 div .ruler

我需要遍历结果集,因此要么将每个找到的对象复制到一个新的 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())
{   
}

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

4

2 回答 2

37
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);

然后,赔率是groupswhere the Keyisfalse的那些元素,而偶数是groupswhere the Keyis的那些元素true

var odds = groups[false];
var evens = groups[true];
于 2012-06-29T22:46:18.487 回答
7

您可以为此目的定义自己的扩展方法:

public static class LinqExtensions
{
    public static IEnumerable<T> SelectOdds<T>(this IEnumerable<T> enumerable)
    {
        bool odd = false;

        foreach (var item in enumerable)
        {
            if (odd)
                yield return item;

            odd = !odd;
        }
    }
}
于 2012-06-29T22:51:35.753 回答