选择IEnumerable的偶/奇元素 ? [重复](Select even/odd ele

2019-06-25 22:40发布

可能重复:
获得奇/偶与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的元素。 意,跳过带班每个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())
{   
}

哪些选项是最好的,我怎么能做到这一点优雅?

Answer 1:

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

然后,胜算的那些元素groups ,其中Keyfalse ,而且是找齐这些元素groups ,其中Keytrue

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


Answer 2:

你可以只基于此目的定义自己的扩展方法:

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;
        }
    }
}


文章来源: Select even/odd elements in IEnumerable? [duplicate]