data.Select(object=> string.Format("<a>{0}</a>", object.LinkText))
.Select(html => string.Format("<div>{0}</div>", html))
.Aggregate((running, next) => running + next);
我有这个查询基本上把一些对象变成了html-markup。我似乎无法实现的是,第二个选择只应针对第一个选择中的每个(固定数量)3个元素运行。我不想这样的事情:
<div><a>xxx</a><a>yyy</a><a>zzz</a></div>
<div><a>ååå</a>....</div>
请帮我避免for循环!
答案 0 :(得分:3)
要按3分组,请使用此LINQ查询:
var data = new[] {"quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};
var res = data
.Select((s, i) => new { Link = string.Format("<a>{0}</a>", s), Index = i })
.GroupBy(p => p.Index/3)
.Select(g => string.Format("<div>{0}</div>", string.Join("", g.Select(v => v.Link))));
foreach (var re in res) {
Console.WriteLine(re);
}
此程序的输出如下所示:
<div><a>quick</a><a>brown</a><a>fox</a></div>
<div><a>jumps</a><a>over</a><a>the</a></div>
<div><a>lazy</a><a>dog</a></div>
请注意此代码如何使用string.Join
代替慢Aggregate
。
当然,由于您使用其他对象而不是字符串,因此您需要将string.Format("<a>{0}</a>", s)
替换为string.Format("<a>{0}</a>", s.LinkText)
。
答案 1 :(得分:0)
在第一个选择.Take(3)
答案 2 :(得分:0)
以下内容可为您提供所需的结果:
var data = new List<String>();
data.BreakIntoChunks(3).Select(html => string.Format("<div>{0}</div>", String.Join("", (html.Select(
item => string.Format("<a>{0}</a>", item))).ToArray())));
...
public static class EnumerableExt
{
public static IEnumerable<IEnumerable<TRecord>> BreakIntoChunks<TRecord>(this IEnumerable<TRecord> items,
int chunkSize)
{
int itemCount = 0;
var processedItems = new List<TRecord>();
foreach (TRecord record in items)
{
++itemCount;
processedItems.Add(record);
if (itemCount%chunkSize == 0)
{
yield return processedItems;
processedItems.Clear();
}
}
if (processedItems.Count != 0)
{
//Because- return the items which are not multiple of chunkSize
yield return processedItems;
}
}
}
注意:结果是在单次迭代中生成的。这是收益率回归的魔力!