Onl*_*ere 14 c# linq ienumerable .net-4.0
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
基本上,我有这些元素,每个元素都在自己的对象中,在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())
{
}
Run Code Online (Sandbox Code Playgroud)
哪种选择最好,我怎样才能做到这一点?
jas*_*son 31
var odds = sequence.Where((item, index) => index % 2 != 0);
var evens = sequence.Where((item, index) => index % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
对于这个解决方案,我唯一不喜欢的是,如果你需要几率和平均值,它需要迭代序列两次.如果由于某种原因你必须避免这种情况,你将不得不更加努力:
var groups = sequence.Select((item, index) => new { Item = item, Index = index })
.GroupBy(x => x.Index % 2 == 0)
.ToDictionary(g => g.Key, g => g);
Run Code Online (Sandbox Code Playgroud)
然后,胜算的那些元件groups
,其中Key
是false
,并且是找齐的那些元件groups
,其中Key
是true
:
var odds = groups[false];
var evens = groups[true];
Run Code Online (Sandbox Code Playgroud)
您可以为此目的定义自己的扩展方法:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11526 次 |
最近记录: |