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 要素を取得するエレガントな方法はありますか? つまり、各 div を class でスキップし.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);

この解決策について私が気に入らない唯一のことは、奇数と偶数の両方が必要な場合、シーケンスを 2 回反復する必要があることです。なんらかの理由でこれを避ける必要がある場合は、さらに努力する必要があります。

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 Keyisの要素でfalseあり、偶数は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 に答える